我有將類似於下面的結構的XML文件:如何根據多個父母的屬性刪除子元素?
<?xml version="1.0" encoding="utf-8"?>
<Root Attr1="Foo" Name="MyName" Attr2="Bar" >
<Parent1 Name="IS">
<Child1 Name="Kronos1">
<GrandChild1 Name="Word_1"/>
<GrandChild2 Name="Word_2"/>
<GrandChild3 Name="Word_3"/>
<GrandChild4 Name="Word_4"/>
</Child1>
<Child2 Name="Kronos2">
<GrandChild1 Name="Word_1"/>
<GrandChild2 Name="Word_2"/>
<GrandChild3 Name="Word_3"/>
<GrandChild4 Name="Word_4"/>
</Child2>
</Parent1>
</Root>
中的元素不會在定義他們可以具有比其它文件不同的值。我所知道的是每個元素的「名稱」屬性,它總是被定義的。我需要能夠根據該名稱操作和/或刪除選定元素內的數據。例如:removeElement("MyName.IS.Kronos1.Word_1")
將刪除Child1
父級下的GrandChild1
元素。
我的問題是,雖然使用LINQ to XML查詢,我無法正確選擇該元素。使用此:
private IEnumerable<XElement> findElements(IEnumerable<XElement> docElements, string[] names)
{
// the string[] is an array from the desired element to be removed.
// i.e. My.Name.IS ==> array[ "My, "Name", "IS"]
IEnumerable<XElement> currentSelection = docElements.Descendants();
foreach (string name in names)
{
currentSelection =
from el in currentSelection
where el.Attribute("Name").Value == name
select el;
}
return currentSelection;
}
要查找我需要刪除的元素產生這樣的結果:
<?xml version="1.0" encoding="utf-8"?>
<Root Attr1="Foo" Name="MyName" Attr2="Bar" >
<Parent1 Name="IS">
<Child1 Name="Kronos1">
<GrandChild2 Name="Word_2"/>
<GrandChild3 Name="Word_3"/>
<GrandChild4 Name="Word_4"/>
</Child1>
<Child2 Name="Kronos2">
<GrandChild2 Name="Word_2"/>
<GrandChild3 Name="Word_3"/>
<GrandChild4 Name="Word_4"/>
</Child2>
</Parent1>
</Root>
調試看來,我做的是重新搜索同一文檔後,但每次都有不同的名字。如何根據多個父屬性名稱搜索和選擇特定元素?
需要注意的是,XML的大小(即元素的等級)也是可變的。這意味着可以有2層(家長)或6層(偉大 - 大孩子)。但是,我需要能夠查看根節點的Name
屬性。
這實際上工作得很好。甚至給我的老闆留下了深刻的印象:) – KronoS
你實際上可以使用'.FirstOrDefault()',如果你不想處理這個異常,它將返回null。 – KronoS
編輯到功能的例子,那麼你確實不需要例外。 @KronoS –