将XmlDocument转换为字符串。

257

这是我目前将 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文件本身包含了 "\",它还能正常工作吗?

6个回答

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

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

return xmlDoc.OuterXml;

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


4
没错,你说得对。我先尝试了那个方法,但在调试器里看到了引号,以为是因为 OuterXml 的问题,所以尝试使用 StringWriter 方法。但是我错了,那些引号只是在调试器里出现。所以我会使用 OuterXml,谢谢。 - akif
1
如果您认为对象可能为空,则空值检查是不言而喻的,对于这里的每个答案,以及在C#中与对象的每次交互 - 我个人尝试确保对象始终被构造,以便我不必在代码中到处膨胀空值检查...我想这取决于您的代码库... - Chris Moutray
12
OuterXml方法不包含声明标签<?xml version="1.0" encoding="utf-16"?>。请注意,翻译后的内容已经尽可能地通俗易懂,但保留了原意,并且没有添加任何解释性的内容。 - hazjack
是的,谢谢提供链接。1.1版本说明必须有一个XML声明http://www.w3.org/TR/xml11/#sec-prolog-dtd - hazjack
3
如果你想要声明性标记,那么可以使用XmlDeclaration类 https://msdn.microsoft.com/zh-cn/library/system.xml.xmldeclaration.aspx - 如果你想将其写入文件,则使用XmlDocument实例中的保存方法 https://msdn.microsoft.com/zh-cn/library/dw229a22.aspx - 对我而言,声明性标记只有在写入文件而不是C#字符串时才有意义。 - Chris Moutray
显示剩余6条评论

210

没有任何引号。只是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 - John Saunders
1
值得注意的是(正如在此处的备注中所提到的:http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx),直到调用XmlWriter的Close方法之前,元素和属性都不会被写入。 - TonE
其中有些可能会立即写入,这取决于缓冲区。尽管如此,我还是添加了一个调用Flush的语句,虽然调用Close或只需关闭xmlTextWriterusing块也能完成相同的工作。 - Brian
18
为了让XML格式更美观,可以将以下设置对象传递给XmlWriter.Create:XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = " "; settings.Encoding = Encoding.UTF8; - Adam Bruss

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

6
作为扩展方法:
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。 - Joel Mueller
2
@Joel Mueller 无论如何,即使有返回值,在离开代码时仍会调用Dispose。 - Peter Krassoi

3
您可以使用xmlDoc.InnerXml属性来获取字符串中的XML。

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接