2012-10-10 3 views
1

문제가 있습니다. XML의 특정 부분을 linq 쿼리로 업데이트하려고하지만 작동하지 않습니다. 그래서 내가 xml 파일 :xml 쿼리를 수행 할 때 작동하지 않는 linq로 업데이트

<?xml version="1.0" encoding="utf-8"?> 
<DesignConfiguration> 
    <Design name="CSF_Packages"> 
    <SourceFolder>C:\CSF_Packages</SourceFolder> 
    <DestinationFolder>C:\Documents and Settings\xxx</DestinationFolder> 
    <CopyLookups>True</CopyLookups> 
    <CopyImages>False</CopyImages> 
    <ImageSourceFolder>None</ImageSourceFolder> 
    <ImageDesinationFolder>None</ImageDesinationFolder> 
    </Design> 
</DesignConfiguration> 

나는 부분을 선택하려는 경우이 부분을 의미 후손 값을 업데이트 한 후 자손을 얻고있다 Design name="somethning"을하고 부분 : 내가 가지고있는

<SourceFolder>C:\CSF_Packages</SourceFolder> 
    <DestinationFolder>C:\Documents and Settings\xxx</DestinationFolder> 
    <CopyLookups>True</CopyLookups> 
    <CopyImages>False</CopyImages> 
    <ImageSourceFolder>None</ImageSourceFolder> 
    <ImageDesinationFolder>None</ImageDesinationFolder> 

을 이 코드 :

 XDocument configXml = XDocument.Load(configXMLFileName); 

     var updateData = configXml.Descendants("DesignConfiguration").Elements().Where(el => el.Name == "Design" && 
      el.Attribute("name").Value.Equals("CSF_Packages")).FirstOrDefault(); 

     configXml.Save(configXMLFileName); 

은 내가 updateData varibale에 널 데이터를 얻고있다. QuickWatch를 통해 Descendat의 기능을 시도 할 때 null 값을 반환합니다. configXML 변수를 검사 할 때 내 전체 XML 데이터가 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

var updateData = 
    confixXml 
    .Root      //Root Element 
    .Elements("Design")  //All elements under root called Design 
    .Where(element => (String)element.Attribute("name") == "AFP_GRAFIKA") //Find the one with the name Attribute of AFP_GRAFIKA 
    .FirstOrDefault();  //Grab the first one it finds or return null. 

if (updateData != null) 
{ 
    var myElements = 
     updateData 
     .Elements();   //All the elements under the Design node 
} 
+0

실제로 'name' 속성의 값이 "AFP_GRAFIKA"인 요소가 있습니까? 해당 속성의 샘플 값은 "CSF_Packages"... –

+0

예를 들어 테스트 중이므로 코드를 보냈습니다. 어디에서 그 일을 유감스럽게 생각하고 있었습니까? –

+0

샘플에서는 문제가 없지만 "AFP_GRAFIKA"대신 "CSF_Packages"를 검색하면 코드가 XML을 검색하는 것으로 나타났습니다. 값이 "AFP_GRAFIKA"인'name' 속성의 경로가 diffe입니다 'DesignConfiguration \ Design'보다 임대. –

답변

0

이보십시오. 왜 그런지는 모르겠지만 작동합니다. 자손 함수 독립 실행 형 함수로 null을 반환하지만 linq 함께 작동하는 것 같습니다. 나는이 시도했지만 내가의 선택 부분을 가지고 있지 않았다 당신이 내 질문을 전송하기 전에 먼저에

var updateData = (from s in configXml.Descendants("Design") 
        where s.Attribute("name").Value == design.DesignName 
        select s).First(); 

: 그래서 내 솔루션을 수행해야하는지 유일한 것은 이것이다. 게다가 s.Atribute 부분을 중괄호 안에 썼을 때 속성 이름 대신 design.DesignName 객체를 삽입했습니다. 그래서 괜찮아요. 도와 주셔서 감사합니다. Til Nex 시간. 모두 좋은 하루 되세요/야간 :

+0

이 일하고있다! :) 대단히 감사합니다. 마지막으로 내 영혼이 왜 작동하지 않는지와 내가 StacOverFlow에서 찾은 다른 것들을 설명 할 수 있습니까? 내 비슷한 사례가 있었으므로 작동하지 않는 것 같았습니다. –

+0

foreach 루프를 사용하여 요소를 내부에서 업데이트하는 방법이 궁금합니다. 그리고 XML에 저장 하시겠습니까? –

+0

예, 접근하는 가장 좋은 방법은 – DaveShaw

0
XDocument xml = XDocument.Load(""); 

XElement settings = (from children in xml.Descendants("DesignConfiguration") 
         where children.Name.Equals("Design") && children.Attribute("name").Equals("CSF_Packages") 
         select children).FirstOrDefault(); 

settings.Element("SourceFolder").SetValue("filepath"); 
settings.Element("CopyImages").SetValue(true); 
+0

이 문제는 Descendant의 기능이 작동하지 않았다, 그것은 null을 검색 (내가 위에서 설명 했어) 내 값을 선택하고 싶지 않았어.DaveShaw의 대답은 효과가 있었지만 왜 작동하지 않았으며 DaveShaw의 대답은 어땠는지 모릅니다. 내가 게시 한 것처럼 나는 이것에 익숙하지 않고 아마도 xml의 건물이 잘못되었다. –

+0

예에서 설정을 확인했습니다. 설정에 null 값이 있습니다. –

0

좋아, 그래서이 문제를 해결하기 위해 관리했습니다 :

0

DesignConfiguration이 루트 노드 였기 때문에 Descendants ("DesignConfiguration")가 null을 반환했습니다 .Descendants ("Design")를 사용하면 자식 노드가 아니라 self.

관련 문제