将XmlDocument转换为String


218

这是我目前将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本身包含“ \”,它将正常工作吗

Answers:


179

没有任何报价。这只是VS调试器。尝试打印到控制台或保存到文件,您将看到。附带说明:始终丢弃一次性物品:

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

2
+1用于固定代码以使用using块而不是XmlTextWriter
约翰·桑德斯

1
值得注意的是(如此处的备注所述:msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx),只有在调用XmlWriter的Close方法之后,才可以写入元素和属性。
TonE

其中一些可能会立即被写入。这取决于缓冲。无论如何,我都添加了对的调用Flush,尽管Close对该xmlTextWriter using块的调用或只是将其关闭也可以实现相同的效果。
Brian

12
为了使xml美观,请将此设置对象传递给XmlWriter.Create:XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars =“”; settings.Encoding = Encoding.UTF8;
亚当·

655

假设xmlDoc是一个XmlDocument对象,那么xmlDoc.OuterXml怎么了?

return xmlDoc.OuterXml;

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


3
好吧,你是对的。我先尝试了一下,但是当我在调试器中看到引号时。我认为是因为OuterXml并尝试使用StringWriter方法。但是我错了,引号只在调试器中。所以我只使用OuterXml。谢谢
akif

为我工作!只需对xmlDoc做一个空检查!返回xmlDoc == null吗?“ xmlDoc为空”:xmlDoc.OuterXml;
SarjanWebDev 2014年

1
@SarjanWebDev如果您认为您的对象可能为null,则对null的检查无需说,这里的每个答案都可以;实际上,对于与C#中的对象进行的每次交互-我个人都试图确保始终构造对象,这样我就不必在任何地方都使用null检查来膨胀代码……我想这只取决于您的代码库。 。
克里斯Moutray

10
(y),但OuterXml不包含声明性标记<?xml version =“ 1.0” encoding =“ utf-16”?>
hazjack

3
@hazjack如果要声明性标记,请使用XmlDeclaration类msdn.microsoft.com/zh-cn/library/system.xml.xmldeclaration.aspx-如果您要将其写入文件,则使用找到的保存方法在您的XmlDocument实例msdn.microsoft.com/zh-cn/library/dw229a22.aspx上 -对我来说,声明性标记仅在您要写文件而不是C#字符串
时才有意义

10

如果您使用的Windows.Data.Xml.Dom.XmlDocument版本XmlDocument(例如,在UWP应用中使用的版本),则可以使用yourXmlDocument.GetXml()来获取XML作为字符串。


5

作为扩展方法:

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()

本示例无法在两个编写器上调用Dispose。
乔尔·穆勒

2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.