【发布时间】:2010-09-24 23:15:52
【问题描述】:
我有一个包含 XML 文件内容的 StringBuilder。 XML 文件内有一个名为<root> 的根标记,其中包含多个<node> 标记。
我想通过 XML 解析来读取 s 中标签的值,但不知道该怎么做。
我必须为此使用一些 C# XML 数据类型吗?
提前致谢
【问题讨论】:
标签: c# xml stringbuilder
我有一个包含 XML 文件内容的 StringBuilder。 XML 文件内有一个名为<root> 的根标记,其中包含多个<node> 标记。
我想通过 XML 解析来读取 s 中标签的值,但不知道该怎么做。
我必须为此使用一些 C# XML 数据类型吗?
提前致谢
【问题讨论】:
标签: c# xml stringbuilder
StringBuilder sb = new StringBuilder (xml);
TextReader textReader = new StringReader (sb.ToString ());
XDocument xmlDocument = XDocument.Load (textReader);
var nodeValueList = from node in xmlDocument.Descendants ("node")
select node.Value;
【讨论】:
您应该使用System.Xml 或System.Xml.Linq 中可用的类来解析XML。
XDocument 是 XML 的 LINQ 扩展的一部分,如果您需要解析任意结构,它特别容易使用。我建议使用它而不是 XmlDocument(除非您有旧代码或不在 .NET 3.5 上)。
从StringBuilder 创建XDocument 很简单:
var doc = XDocument.Parse( stringBuilder.ToString() );
从这里,您可以使用FirstNode、Descendents() 以及许多其他可用于遍历和检查 XML 结构的属性和方法。由于XDocument 被设计为与 LINQ 很好地配合使用,您还可以编写如下查询:
var someData = from node in doc.Descendants ("yourNodeType")
select node.Value; // etc..
【讨论】:
如果您只是查看特定命名的节点,则不需要将文档加载到内存中,您可以使用 XmlReader 自己处理它。
using(var sr = new StringReader(stringBuilder.ToString)) {
using(var xr = XmlReader.Create(sr)) {
while(xr.Read()) {
if(xr.IsStartElement() && xr.LocalName == "node")
xr.ReadElementString(); //Do something here
}
}
}
【讨论】:
使用 XDocument.Parse(...)
【讨论】:
您可以使用多种对象来处理 XML。查看 System.Xml 命名空间中的对象,例如 XmlDocument 以及 XmlReader 和 XmlWriter 对象系列。如果使用 C# 3.0+,请查看 System.Xml.Linq 命名空间和 XDocument 类。
【讨论】:
如果您要读取 XML 文件中的所有值,可以考虑将 XML 反序列化为 C# 数据对象。
【讨论】:
是的,我建议您使用XmlDocument 对象来解析字符串的内容。 这是一个打印标签中包含的所有内部文本的示例:
var doc=new XmlDocument();
doc.LoadXml(stringBuilder.TosTring());
XmlNodeList elemList = doc.GetElementsByTagName("node");
for (int i=0; i < elemList.Count; i++)
{
XmlNode node=elemList[i];
Console.WriteLine(node.InnerText);
}
使用 Node 对象成员,您还可以轻松提取所有属性。
【讨论】: