2009-11-18 2 views
0

문제점이 있습니다. 나는 다음과 같은 계층 적 XML 데이터를 가지고 :XElement.Descendants ("Node")가 예상대로 작동하지 않고 여러 수준의 자손을 반환합니다.

<Tree> 
    <Node Text="Stuff" ItemGUID="064a9bf0-0594-47f8-87be-88dd73763c77" > 
    <Node Text="Food" ItemGUID="326f1f7a-d364-4838-9bdc-ce5fd93f88ca" ItemType="2" /> 
    <Node Text="Wines" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
    <Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4"> 
     <Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f"> 
       <Node Text="Red" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
       <Node Text="Pink" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
       <Node Text="White" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
     </Node> 
     <Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
     <Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
    </Node> 
    <Node Text="Sweet Delights" ItemGUID="1df7dbae-adf0-49a9-aaac-1358468a245b" /> 
    </Node> 
</Tree> 

을 그리고 난 다음 코드를 사용하고 단지 레드 (장미 아래) 핑크, 화이트없이 꽃 (장미, 튤립, 무엇이든)을 얻기 위해 필요하지만, 때문에 모든 노드가 "노드"라는 사실에 따라 모든 수준의 Descendats를 얻을 수 있습니다. 나는 그것을 단지 한 수준으로 제한하고 싶다.

XElement loadedXML = clients.ItemTreeXML; 

//filter only current node 
XElement procXML; 
procXML = new XElement ("Tree", 
      from el in loadedXML.Descendants("Node") 
      where (string)el.Attribute("ItemGUID") == currentNodeGUID 
      select el); 

결과 구함 :

<Tree> 
     <Node Text="Flowers" ItemGUID="cefa8c34-af06-48e7-9c00-4b1422d217a4"> 
      <Node Text="Roses" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
      <Node Text="Tulips" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
      <Node Text="Whatever" ItemGUID="950e3ca3-27a1-41fd-89f3-7a8b08633a9f" /> 
     </Node> 
</Tree> 

감사합니다,

추가

: 아마 SQL 2008 쿼리는 내가 필요로하는 경우에만 노드 분기를 retreive 할 수도 있지만 연구와 테스트를 많이 후, 나는 할 수 없었다 대답을 찾으십시오 ... (내 XML은 SQL 2008의 XML 컬럼에 있습니다)

답변

0

그래서 우리는 이것을 가지고 있습니다 ...

XElement loadedXML = XElement.Load("test.xml"); 

//filter only current node 
XElement procXML; 
procXML = new XElement("Tree", 
    from el in loadedXML.Descendants("Node") 
    where (string)el.Attribute("ItemGUID") == currentNodeGUID 
    select el); 

가장 좋은 방법은 LINQ 쿼리를 수행 한 후 모든 하위 요소를 제거하는 것입니다. 이처럼 :

출력 당신이 원하는 것 무엇
foreach (XElement xl in procXML.Element("Node").Elements("Node")) 
{ 
    if (xl.HasElements) // just remove the ones without child elements 
    { 
     xl.RemoveNodes(); 
    } 
} 

,하지만 난 추가해야는 ... 가장 확실히이 할 수있는 더 좋은 방법이있다. 필자는 대부분의 코드가 이보다 더 동적으로 작업해야한다는 점을 감안할 때 자신의 상황에서 얼마나 잘 작동하는지 모르겠습니다.

나는이 질문을보고 Linq에 잠수를하기로 결정했다. 나는 그렇게 나쁘지 않다고 생각한다. 그것이 필요한 방식으로 작동하지 않는다면 적어도 시작일뿐입니다.

+0

감사합니다. 나는 똑같은 일을하고 있었다. 더 빠른 방법이 있는지 궁금합니다. 선택적으로 SQL 2008 XML 쿼리는 훌륭하지만 필요한 노드 집합 만 얻는 방법을 찾을 수 없습니다. 실제로 나는 많은 브랜치 중 하나와이 브랜치의 한 레벨만을 필요로 할 때 거대한 XML을로드하는 것을 피하고 싶습니다. – mfr

관련 문제