XmlDocumentを文字列に変換


218

ここに私が現在XMLDocument文字列に変換している方法があります

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

xmlDoc.WriteTo(xmlTextWriter);

return stringWriter.ToString();

このメソッドの問題は、"((quotes)が属性にある)がある場合、エスケープされることです。

例えば:

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

上記は予想されるXMLです。しかし、それは戻ります

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

String.Replace "\"を実行できますが、その方法は大丈夫ですか?副作用はありますか?XML自体に「\」が含まれている場合、問題なく動作しますか

回答:


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
John Saunders

1
要素と属性はXmlWriterのCloseメソッドを呼び出すまで書き込まれないことに注意してください(ここの注釈で述べたように、msdn.microsoft.com / en-us / library / system.xml.xmlwriter.aspx)。
TonE 2011

それらのいくつかはすぐに書かれるかもしれません。それはバッファリングに依存します。とにかく、への呼び出しを追加しましたが、ブロックFlushへの呼び出しCloseまたはxmlTextWriter usingブロックを閉じるだけでも同じことが実現します。
ブライアン

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でnullチェックを実行するだけです!xmlDoc == nullを返しますか?"xmlDocはnull":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/en-us/library/system.xml.xmldeclaration.aspxを使用します。ファイルに書き込みたい場合は、見つかったsaveメソッドを使用します。 XmlDocumentインスタンスmsdn.microsoft.com/en-us/library/dw229a22.aspx-宣言的なタグは、C#文字列ではなくsayファイルに書き込んでいる場合にのみ意味があります
Chris Moutray '28

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

この例では、2つのライターでDisposeを呼び出すことができません。
Joel Mueller

2

"\"デバッガーと同じように表示されますが、データは文字列で正しく、何も置き換える必要はありません。文字列をファイルにダンプしようとすると、文字列が正しいことがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.