如何从 XDocument 获取 Xml 作为字符串?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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());

【讨论】:

以上是关于如何从 XDocument 获取 Xml 作为字符串?的主要内容,如果未能解决你的问题,请参考以下文章

从字符串填充 XDocument

如何从元素中具有相同名称的 xml 文件中获取特定值?

当我们有多个同名但属性不同的元素时,如何使用 Xdocument 从 xml 中删除一个元素

解析字符串 XML C# WPF

XDocument 读取具有名称空间的根元素的 XML 文件

如何在 XDocument 对象中获取属性