如何从Xdocument获取Xml作为字符串

Ash*_*pta 66 .net c# xml string linq-to-xml

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

小智 89

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

XDocument xmlDoc ...
string xml = xmlDoc.ToString();
Run Code Online (Sandbox Code Playgroud)

这适用于所有XObject,如XElement等.

  • 这个方法到底是什么意思?o.0 (22认同)
  • 现在返回`System.Xml.XmlDocument` (4认同)
  • @TheMuffinMan然后你做错了,因为这个答案是关于XDocument而不是XmlDocument(Linq) (3认同)
  • 如果您的任何 XML 包含“&”或其他特殊字符,则此操作将不起作用 (2认同)

Mik*_*oft 11

一些回复给出了稍微错误的答案。

  • XDocument.ToString()省略 XML 声明(并且,根据 @Alex Gordon 的说法,如果它包含编码的异常字符(如 ),则可能返回无效的 XML &)。
  • 保存XDocumentStringWriter将导致 .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());
Run Code Online (Sandbox Code Playgroud)

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


Maf*_*fii 9

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

"System.Xml.XmlDocument"

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

XmlDocument xml = ...;
string result;

using (StringWriter writer = new StringWriter())
{
  xml.Save(writer);
  result = writer.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,这很令人困惑,但是如果您使用的是Linq,则应该使用XDocument而不是XmlDocument。然后它应该工作:-)。 (4认同)

Wol*_*eld 5

执行 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());
Run Code Online (Sandbox Code Playgroud)