【问题标题】:How to get Xml as string from XDocument?如何从 XDocument 获取 Xml 作为字符串?
【发布时间】:2011-05-30 20:03:34
【问题描述】:

我是 LINQ to XML 的新手。构建了XDocument 之后,如何像使用XmlDocument 一样获得它的OuterXml

【问题讨论】:

    标签: c# .net xml string linq-to-xml


    【解决方案1】:

    您只需要使用对象的重写 ToString() 方法即可:

    XDocument xmlDoc ...
    string xml = xmlDoc.ToString();
    

    这适用于所有 XObject,例如 XElement 等。

    【讨论】:

    • 这个方法到底是干什么用的? o.0
    • 有一个简单的XmlDocument.OuterXml属性链接只是为了简单的演示。
    • 现在返回System.Xml.XmlDocument
    • @TheMuffinMan 那你做错了,因为这个答案是关于 XDocument 而不是 XmlDocument (Linq)
    • 如果您的任何 XML 有 & 或其他特殊字符,这将不起作用
    【解决方案2】:

    我不知道什么时候改变了,但是今天(2017 年 7 月)在尝试答案时,我得到了

    "System.Xml.XmlDocument"

    代替ToString(),您可以使用最初预期的方式访问XmlDocument 内容:将xml doc 写入流。

    XmlDocument xml = ...;
    string result;
    
    using (StringWriter writer = new StringWriter())
    {
      xml.Save(writer);
      result = writer.ToString();
    }
    

    【讨论】:

    • 当然这很令人困惑,但如果您使用的是 Linq,您应该使用 XDocument 而不是 XmlDocument。然后它应该工作:-)。
    【解决方案3】:

    执行 XDocument.ToString() 可能无法获得完整的 XML。

    为了将 XML 文档开头的 XML 声明作为字符串获取,请使用 XDocument.Save() 方法:

        var ms = new MemoryStream();
        using (var xw = XmlWriter.Create(new StreamWriter(ms, Encoding.GetEncoding("ISO-8859-1"))))
            new XDocument(new XElement("Root", new XElement("Leaf", "data"))).Save(xw);
        var myXml = Encoding.GetEncoding("ISO-8859-1").GetString(ms.ToArray());
    

    【讨论】:

    • 几乎不需要这种复杂性和一次又一次的复制。直接使用StringWriter()Save() 即可。
    【解决方案4】:

    几个回答给出了一个稍微不正确的答案。

    • XDocument.ToString() 省略了 XML 声明(根据@Alex Gordon 的说法,如果 XML 包含编码的异常字符,例如 &,则可能返回无效的 XML)。
    • XDocument 保存为StringWriter 将导致.NET 发出encoding="utf-16",这很可能是您不希望的(如果您将XML 保存为字符串,可能是因为您想稍后将其保存为文件, 保存文件的实际标准是 UTF-8 - .NET 将文本文件保存为 UTF-8,除非另有说明)。
    • @Wolfgang Grinfeld 的回答正朝着正确的方向发展,但它过于复杂。

    使用以下内容:

      var memory = new MemoryStream();
      xDocument.Save(memory);
      string xmlText = Encoding.UTF8.GetString(memory.ToArray());
    

    这将返回带有 UTF-8 声明的 XML 文本。

    【讨论】:

      【解决方案5】:

      使用 ToString() 将 XDocument 转换为字符串:

      string result = string.Empty;
      XElement root = new XElement("xml",
          new XElement("MsgType", "<![CDATA[" + "text" + "]]>"),
          new XElement("Content", "<![CDATA[" + "Hi, this is Wilson Wu Testing for you! You can ask any question but no answer can be replied...." + "]]>"),
          new XElement("FuncFlag", 0)
      );
      result = root.ToString();
      

      【讨论】:

        【解决方案6】:

        我在 XDocument.Save 方法的 Microsoft .NET 6 文档中找到了这个示例。我认为它回答了最初的问题(XmlDocument.OuterXml 的 XDocument 等价物是什么),并且还解决了其他人已经指出的问题。通过使用 XmlWritingSettings,您可以预见性地控制字符串输出。

        https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xdocument.save

        StringBuilder sb = new StringBuilder();
        XmlWriterSettings xws = new XmlWriterSettings();
        xws.OmitXmlDeclaration = true;
        xws.Indent = true;
         
        using (XmlWriter xw = XmlWriter.Create(sb, xws)) {
            XDocument doc = new XDocument(
                new XElement("Child",
                    new XElement("GrandChild", "some content")
                )
            );
            doc.Save(xw);
        }
        Console.WriteLine(sb.ToString());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-27
          • 2014-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多