我有一些看起来像这样的 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>
如您所见,它的结构使得可以定义由一个或多个属性组成的“快捷方式”。然后可以使用属性或一个或多个快捷方式或两者的混合来明确描述数据(并且没有特定的顺序)。
我想用 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 的最佳方法是什么?