将 XmlDocument 转换为字符串

Convert XmlDocument to String

提问人:akif 提问时间:3/9/2010 最后编辑:akif 更新时间:1/11/2021 访问量:317487

问:

以下是我目前将 XMLDocument 转换为 String 的方法

StringWriter stringWriter = new StringWriter();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter);

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

这种方法的问题在于,如果我有 ((引号) 我在属性中)它会转义它们。

例如:

<Campaign name="ABC">
</Campaign>

上面是预期的 XML。但它又回来了

<Campaign name=\"ABC\">
</Campaign>

我可以做 String.Replace “\”,但那个方法可以吗?有副作用吗?如果 XML 本身包含一个"\"

C# 字符串 转义 引号 xmldocument

评论


答:

210赞 Darin Dimitrov 3/9/2010 #1

没有任何引号。它只是 VS 调试器。尝试打印到控制台或保存到文件,您就会看到。附带说明:始终处理一次性物品:

using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    xmlDoc.WriteTo(xmlTextWriter);
    xmlTextWriter.Flush();
    return stringWriter.GetStringBuilder().ToString();
}

评论

2赞 John Saunders 3/9/2010
+1 用于修复代码以使用块而不是 .usingXmlTextWriter
1赞 TonE 8/23/2011
值得一提的是(如此处的备注中所述:msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx),在调用 XmlWriter 的 Close 方法之前,不会写入元素和属性。
0赞 Brian 3/28/2012
其中一些可能会立即写入。这取决于缓冲。无论如何,我添加了一个调用,尽管调用或只是关闭块也会完成相同的工作。FlushClosexmlTextWriterusing
18赞 Adam Bruss 9/19/2012
要使 xml 漂亮,请将此设置对象传递给 XmlWriter.Create: XmlWriterSettings settings settings = new XmlWriterSettings();设置。缩进 = true;设置。缩进字符 = “ ”;设置。编码 = Encoding.UTF8;
735赞 Chris Moutray 3/9/2010 #2

假设 xmlDoc 是 XmlDocument 对象,那么 xmlDoc.OuterXml 有什么问题?

return xmlDoc.OuterXml;

OuterXml 属性返回 xml 的字符串版本。

评论

4赞 akif 3/9/2010
好吧,你是对的。我先尝试了一下,但是当我在调试器中看到引号时。我以为这是因为 OuterXml 并尝试使用 StringWriter 方法。但是我错了,引号只在调试器中。因此,我将只使用 OuterXml。谢谢
0赞 SarjanWebDev 10/27/2014
为我工作!只需对 xmlDoc 进行空检查即可!返回 xmlDoc == null ?“xmlDoc 为 null”:xmlDoc.OuterXml;
1赞 Chris Moutray 10/27/2014
@SarjanWebDev如果你认为你的对象可能是空的,那么空检查就不言而喻了,对于这里的每个答案;实际上,对于与 C# 中对象的每次交互 - 就我个人而言,我试图确保始终构造对象,这样我就不必到处用 null 检查来膨胀代码......我想这只取决于你的代码库......
12赞 hazjack 9/28/2015
(y) 但 OuterXml 不包括声明性标记 <?xml version=“1.0” encoding=“utf-16”?>
3赞 Chris Moutray 9/28/2015
@hazjack如果你想要声明性标签,那么就使用 XmlDeclaration 类 msdn.microsoft.com/en-us/library/system.xml.xmldeclaration.aspx - 如果你想把它写到文件中,那么就使用在你的 XmlDocument 实例上找到的保存方法 msdn.microsoft.com/en-us/library/dw229a22.aspx - 对我来说,声明性标签只有在你写文件而不是 C# 字符串时才有意义
2赞 Arsen Mkrtchyan 3/9/2010 #3

"在调试器中显示,但字符串中的数据是正确的,无需替换任何内容。尝试将字符串转储到文件中,您会注意到该字符串是正确的。\"

6赞 SixOThree 10/2/2012 #4

作为扩展方法:

public static class Extensions
{
    public static string AsString(this XmlDocument xmlDoc)
    {
        using (StringWriter sw = new StringWriter())
        {
            using (XmlTextWriter tx = new XmlTextWriter(sw))
            {
                xmlDoc.WriteTo(tx);
                string strXmlText = sw.ToString();
                return strXmlText;
            }
        }
    }
}

现在简单地使用:

yourXmlDoc.AsString()

评论

0赞 Joel Mueller 1/13/2015
此示例无法对两个编写器调用 Dispose。
2赞 Peter Krassoi 11/29/2021
@Joel Mueller Dispose 在离开代码时仍然被调用,尽管返回。
13赞 Whyser 3/1/2016 #5

如果使用的是版本(例如,在 UWP 应用中使用),则可以使用 XML 以字符串形式获取。Windows.Data.Xml.Dom.XmlDocumentXmlDocumentyourXmlDocument.GetXml()

3赞 احمد بندارى 1/11/2021 #6

可以使用属性获取字符串中的 XMLxmlDoc.InnerXml