如何从 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 中删除一个元素