【问题标题】:C# Xml Parsing from StringBuilder来自 StringBuilder 的 C# Xml 解析
【发布时间】:2010-09-24 23:15:52
【问题描述】:

我有一个包含 XML 文件内容的 StringBuilder。 XML 文件内有一个名为<root> 的根标记,其中包含多个<node> 标记。

我想通过 XML 解析来读取 s 中标签的值,但不知道该怎么做。

我必须为此使用一些 C# XML 数据类型吗?

提前致谢

【问题讨论】:

    标签: c# xml stringbuilder


    【解决方案1】:
    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;
    

    【讨论】:

      【解决方案2】:

      您应该使用System.XmlSystem.Xml.Linq 中可用的类来解析XML。

      XDocument 是 XML 的 LINQ 扩展的一部分,如果您需要解析任意结构,它特别容易使用。我建议使用它而不是 XmlDocument(除非您有旧代码或不在 .NET 3.5 上)。

      StringBuilder 创建XDocument 很简单:

      var doc = XDocument.Parse( stringBuilder.ToString() );
      

      从这里,您可以使用FirstNodeDescendents() 以及许多其他可用于遍历和检查 XML 结构的属性和方法。由于XDocument 被设计为与 LINQ 很好地配合使用,您还可以编写如下查询:

      var someData = from node in doc.Descendants ("yourNodeType")
                     select node.Value; // etc..
      

      【讨论】:

        【解决方案3】:

        如果您只是查看特定命名的节点,则不需要将文档加载到内存中,您可以使用 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
            }
          }
        }
        

        【讨论】:

        • 这比上述方法更有效。几乎零内存占用。太棒了!!。
        【解决方案4】:

        使用 XDocument.Parse(...)

        【讨论】:

          【解决方案5】:

          您可以使用多种对象来处理 XML。查看 System.Xml 命名空间中的对象,例如 XmlDocument 以及 XmlReaderXmlWriter 对象系列。如果使用 C# 3.0+,请查看 System.Xml.Linq 命名空间和 XDocument 类。

          【讨论】:

            【解决方案6】:

            如果您要读取 XML 文件中的所有值,可以考虑将 XML 反序列化为 C# 数据对象。

            Deserializing XML into class obj in C#

            【讨论】:

              【解决方案7】:

              是的,我建议您使用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 对象成员,您还可以轻松提取所有属性。

              【讨论】:

              • 使用 LoadXml 的内存效率非常低。它的内存占用太高(几乎是普通 xml 占用空间的 10 倍)。用户只想读取数据,这样我们就可以在不加载到内存的情况下完成。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-26
              • 2013-08-21
              • 2012-02-05
              相关资源
              最近更新 更多