【发布时间】:2014-01-18 06:39:27
【问题描述】:
考虑以下我必须解析的 XML。
<root>
<item>
<itemId>001</itemId>
<itemName>test 1</itemName>
<description/>
</item>
</root>
我必须解析它的每个标签并将其存储到一个表中,如下所示:
TAG_NAME TAG_VALUE IsContainer
------------ -------------- -----------
root null true
item null true
itemId 001 false
itemName test 1 false
description null false
/item null true
/root null true
现在完成这项工作,我使用XmlReader,因为这允许我们解析每个节点。
我是这样做的:
我创建了以下类来包含每个标签的数据
public class XmlTag
{
public string XML_TAG { get; set; }
public string XML_VALUE { get; set; }
public bool IsContainer { get; set; }
}
我正在尝试获取标签列表(包括结束标签),如下所示:
private static List<XmlTag> ParseXml(string path)
{
var tags = new List<XmlTag>();
using (var reader = XmlReader.Create(path))
{
while (reader.Read())
{
var tag = new XmlTag();
bool shouldAdd = false;
switch (reader.NodeType)
{
case XmlNodeType.Element:
shouldAdd = true;
tag.XML_TAG = reader.Name;
//How do I get the VALUE of current reader?
//How do I determine if the current node contains children nodes to set IsContainer property of XmlTag object?
break;
case XmlNodeType.EndElement:
shouldAdd = true;
tag.XML_TAG = string.Format("/{0}", reader.Name);
tag.XML_VALUE = null;
//How do I determine if the current closing node belongs to a node which had children.. like ROOT or ITEM in above example?
break;
}
if(shouldAdd)
tags.Add(tag);
}
}
return tags;
}
但我很难确定以下内容:
- 如何确定当前
ELEMENT是否包含子XML 节点?设置IsContainer属性。 - 如果是
XmlNodeType.Element类型,如何获取当前节点值的值
编辑:
我曾尝试如下使用 LINQ to XML:
var xdoc = XDocument.Load(@"SampleItem.xml");
var tags = (from t in xdoc.Descendants()
select new XmlTag
{
XML_TAG = t.Name.ToString(),
ML_VALUE = t.HasElements ? null : t.Value,
IsContainer = t.HasElements
}).ToList();
这给了我 XML 标记及其值,但这并没有给我所有的标记,包括结束标记。这就是为什么我决定尝试XmlReader。但如果我遗漏了 LINQ to XML 示例中的任何内容,请纠正我。
【问题讨论】:
-
你有首先使用
XmlReader吗?除非您担心将大量文件加载到内存中,否则使用 LINQ to XML(甚至只是 XmlDocument)将使生活变得更加简单。 -
我不必使用 XmlReader,文件也不是很大。我尝试 XmlReader 的唯一原因是表结构。我必须阅读所有 XML 标记(包括结束标记)。如果您能给我一个关于如何使用 LINQ to XML 或 XmlDocument 的小例子,我将不胜感激。谢谢
-
@JonSkeet - 您能否详细说明或为我们提供一些链接,为什么我们不应该使用 XmlReader?
标签: c# xml-parsing xmlreader