2016-06-02 3 views
-1

У меня есть файл XML, из которого я хочу, чтобы извлечь узлы, идентификатор атрибута «Необходимое»:Как извлечь определенные узлы из XML-файла вместе с родителями?

<root> 
<level1 id="NotNeeded"> 
</level1> 
<level1 id="Needed"> 
    <level2 id="Needed"> 
     <level3 id="Needed">I need this one</level3> 
     <level3 id="NotNeeded1">I don't need this one</level3> 
    </level2> 
    <level2 id="notNeeded"> 
     <level3 id="notNeeded">I don't need this one</level3> 
    </level2> 
</level1> 
</root> 

(Глубина произвольна) мне нужно, чтобы преобразовать его в следующем виде:

<root> 
<level1 id="Needed"> 
    <level2 id="Needed"> 
     <level3 id="Needed">I need this one</level3> 
    </level2> 
</level1> 
</root> 

Что я пытаюсь сделать (с псевдокодом, я надеюсь, это понятно):

myextraction=[element with id "Needed"] 
while [myextraction has parent] 
{ 
myextraction=myextraction.[parent without children].Addtochildren(myextraction) 
} 

есть ли более простой способ сделать это? (Возможно встроенный метод?)

+0

Ваша постановка задачи оставляет один случай: что делать, если родитель 'NotNeeded' но ребенок элемент? –

+0

Я использовал NotNeeded только для узлов, у которых нет нужного ребенка – Viktor

ответ

1

Вы можете использовать Linq до Xml и сделать это.

XDocument doc = XDocument.Load(filepath); 
doc.Descendants() 
    .Where(x=>x.Attribute("id") != null && x.Attribute("id").Value == "NotNeeded") 
    .Remove(); 

Ouput:

<root> 
    <level1 id="Needed"> 
    <level2 id="Needed"> 
     <level3 id="Needed">I need this one</level3> 
    </level2> 
    </level1> 
</root> 

Проверить это fiddle

+0

Небольшой совет, запрос может использовать явные преобразования для уменьшения до .Where (x => (string) x.Attribute ("id") = = "NotNeeded") '. –

Смежные вопросы