我有一个类似于以下结构的 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")
将删除父项 GrandChild1
下的元素。Child1
我的问题是,在使用 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
属性。