web-dev-qa-db-ja.com

C#で、インデントを使用してXmlNodeを文字列に変換するにはどうすればよいですか? (ループなし)

これはとても単純な質問でなければなりませんが、私は答えを得ることができません。

XmlNodeがあり、読みやすくするためにインデント(タブまたはスペース)をそのままにして、このノードを文字列として出力するだけです。

これまで、XmlWriter、XmlTextWriter、XmlDocument、XmlReaderを試しました。

  • XmlDocumentでPreserveWhitespaceを試しましたが、XmlDocumentでノードを出力できませんでした。
  • XmlTextWriterでFormatting = Formatting.Indentedプロパティを試しましたが、内容を文字列に出力する方法がわかりませんでした。

インデントなしでXmlNodeを文字列として出力するのは簡単です。 XmlNode.OuterXmlを実行します。そこにインデントを取得するにはどうすればよいですか?

XmlNodeをループせず、ブルートフォースを使用して空白を追加せずにこれを実行したいのは、もっと簡単な方法があるはずだからです。

ありがとう。

編集:将来の読者のために、ここに答えがあります:

  var xmlNode = is some object of type XmlNode

  using (var sw = new StringWriter())
  {
      using (var xw = new XmlTextWriter(sw))
      {
        xw.Formatting = Formatting.Indented;
        xw.Indentation = 2; //default is 1. I used 2 to make the indents larger.

        xmlNode.WriteTo(xw);
      }
      return sw.ToString(); //The node, as a string, with indents!
  }

これを行う必要がある理由は、構文が強調表示されたノードのxmlを出力するためでした。 AvalonEditを使用してxmlを強調表示し、強調表示されたテキストをhtmlに出力してから、htmlをRichTextBoxに表示できるFlowDocumentに変換しました。

20
Yuf

あなたはXMLTextWriterで正しい道を進んでいました、あなたは単にベースストリームとしてStringWriterを使う必要があります。これが いくつかの良い答え これがどのように達成されるかについてです。エンコーディングをUTF-8にする必要がある場合は、2番目の回答に特に注意してください。

編集:

複数の場所でこれを行う必要がある場合は、XmlNodeToString()をオーバーロードする拡張メソッドを作成するのは簡単です。

public static class MyExtensions
{
    public static string ToString(this System.Xml.XmlNode node, int indentation)
    {
        using (var sw = new System.IO.StringWriter())
        {
            using (var xw = new System.Xml.XmlTextWriter(sw))
            {
                xw.Formatting = System.Xml.Formatting.Indented;
                xw.Indentation = indentation;
                node.WriteContentTo(xw);
            }
            return sw.ToString();
        }
    }
}
29
drharris

メモリやパフォーマンスを気にしない場合、最も簡単なことは次のとおりです。

    XElement.Parse(xmlNode.OuterXml).ToString()
0
Kirill Osenkov