25

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

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 に変換しました。

4

2 に答える 2

30

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

編集:

複数の場所でこれを行う必要がある場合、ToString()onをオーバーロードする拡張メソッドを書くのは簡単XmlNodeです:

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();
        }
    }
}
于 2011-06-22T15:16:49.363 に答える