以下の構造に似た 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 つのレベル (Great-Great-GrandChildren) があります。ただし、ルート ノードのName
属性も確認できるようにする必要があります。