2010-09-21 3 views
1

Я просто пытаюсь запросить XML-документ и перебрать результаты за минусом определенных элементов. В идеале я хотел бы достичь этого в запросе, а не удалять его из коллекции до или во время итерации.Linq to Xml, Filter Element from Query (C#)

<body> 
     Stuff I want 
    <element> 
     Stuff I dont want 
    </element> 
</body> 

Я пытался что-то вдоль этих линий, но не везло ....

 var doc = XDocument.Load("document.xml"); 
     var results = doc.Descendants("body") 
         .Where(x => x.Name != "element") 

Я, конечно, из моего элемента с помощью XML, извинения, если это было отвечено уже.

+3

+1 за каламбур. – StriplingWarrior

+0

Как определена ваша схема? Могут ли ваши нежелательные элементы появляться в нескольких местах, или все они сразу под телом? – StriplingWarrior

+1

Лучший образец XML поможет. Является ли «Stuff I want» просто текстовым или может быть сочетание текста и элементов? –

ответ

1

Один из способов сделать это - захватить документ, запросить нужный материал, а затем .Remove() их. Например, если вы XML выглядел примерно следующее:

<body> 
    Stuff I want 
    <element>Stuff I dont want</element> 
    <element>Stuff I want</element> 
</body> 

Вы могли бы сделать следующий код, чтобы изменить документ все для содержащих кроме «вещей я не хочу»:

 var doc = XDocument.Load("foo.xml"); 

     IEnumerable<XElement> nodes = 
           from node in doc.Descendants("element") 
           where node.Value == "Stuff I dont want" 
           select node; 

     if (nodes != null) 
     { 
      nodes.Remove(); 
     } 

что бы тогда дать следующее ваш документ:

<body> 
    Stuff I want 
    <element>Stuff I want</element> 
</body> 
+0

Почти соблазн разрушить ваш очень хороший результат (404) с помощью upvote :), но не должен 'nodes.Remove()' на самом деле больше по строкам 'nodes.ToList(). ForEach (e => e. Удалить()) '? (Кроме того, для более nitpicking я думаю, что 'nodes' никогда не будет нулевым, возможно, пустым) –