次のような XML があります (非常に単純化されています)。
<?xml version="1.0"?>
<example>
<shortcuts>
<shortcut name="shortcut1">
<property name="name1" value="value1" />
<property name="name2" value="value2" />
</shortcut>
</shortcuts>
<data>
<datum name="datum1">
<property name="name1" value="value1" />
<property name="name2" value="value2" />
</datum>
<datum name="datum2">
<shortcutRef name="shortcut1" />
</datum>
<datum name="datum3">
<shortcutRef name="shortcut1" />
<property name="name3" value="value3" />
</datum>
</data>
</example>
ご覧のとおり、1 つ以上のプロパティで構成される「ショートカット」を定義できるように構造化されています。データは、プロパティ、1 つ以上のショートカット、または両方の組み合わせを使用して明示的に記述できます (特定の順序はありません)。
これを XmlReader で解析したい (XmlDocument の方が簡単ですが、XML ファイルが大きすぎるため、ここでは機能しません)。これを行う良い方法は、各ショートカットの XML サブツリーを、固有のショートカット名でキー付けされた辞書に格納することだと思いました。次に、それらが参照されると、メインのサブツリーではなく、そのサブツリー XmlReader を読み取ることができます。ただし、サブツリー XmlReader は引き続きメインの XmlReader にリンクする必要があります。これは、出力される XML が期待どおりのものではないためです。これが私のコードです:
using(XmlReader xml = XmlReader.Create("example.xml"))
{
Dictionary<string, XmlReader> shortcuts = new Dictionary<string, XmlReader>();
xml.ReadToDescendant("shortcuts");
xml.ReadToDescendant("shortcut");
do
{
shortcuts.Add(xml.GetAttribute("name"), xml.ReadSubtree());
} while(xml.ReadToNextSibling("shortcut"));
xml.ReadToFollowing("data");
while(xml.ReadToFollowing("datum"))
{
Console.WriteLine(xml.GetAttribute("name"));
XmlReader datum = xml.ReadSubtree();
while(datum.Read())
{
if(datum.Name == "property")
{
Console.WriteLine(datum.GetAttribute("name") + ':' + datum.GetAttribute("value"));
}
else if(datum.Name == "shortcutRef")
{
XmlReader shortcut_ref = shortcuts[datum.GetAttribute("name")];
while(shortcut_ref.ReadToFollowing("property"))
{
Console.WriteLine(shortcut_ref.GetAttribute("name") + ':' + shortcut_ref.GetAttribute("value"));
}
}
}
}
}
このように構造化された XML を解析する最良の方法は何ですか?