我似乎对我要解析的XML存在问题。
XML看起来像这样:
<room>
<property1>3</property1>
<property2>2</property2>
...
<instances>
<instance name="instance1" x="0" y="0" />
<instance name="instance2" x="0" y="0" />
<instances>
</room>
我正在尝试遍历所有instance
标记,但是C#似乎不支持具有关闭快捷方式的标记(<tag attribute="value" />
)。
这是我的代码:
XmlReader reader = XmlReader.Create("file.xml");
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "instances")
{
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.Read();
Logger.Log(reader.Name);
}
}
}
似乎只迭代一个instance
标记并跳过其余标记。我尝试了一些方法,包括LINQ和XDocument,但似乎有相同的效果。然后我意识到它可能是,因为C#不支持标签关闭快捷方式。这是真的?有没有办法可以启用对快捷方式的支持?我做错了吗?
如果C#不支持结束快捷方式,我是否可以使用支持此功能的优秀C#XML库?
答案 0 :(得分:3)
首先,除非你真的需要,否则我会避免使用XmlReader
- 通常是因为文档太大了。如果您正在解析一个您很乐意在内存中使用的文档,那么您可以使用LINQ to XML(XDocument.Load
等),这将更加简单。
在XmlReader
内,您可以使用IsEmptyElement
检测您是否在此类元素上,并避免再次调用Read
。
以下是使用LINQ to XML读取所有instance
元素的示例:
XDocument doc = XDocument.Load("file.xml");
foreach (var instance in doc.Descendants("instance"))
{
Logger.Log(instance.Attribute("name").Value);
}
答案 1 :(得分:0)
我认为do-while loop
会更合适:
do {
reader.Read();
Logger.Log(reader.Name);
}
while (reader.NodeType != XmlNodeType.EndElement);