web-dev-qa-db-ja.com

C#でのXMLwriterのインデントと新しい行コマンド

一部のデータをXMLファイルに書き込んでいます...しかし、それを開くと、すべての値が1行に表示されます...どのようにして読み取り可能な形式で書き込むことができますか?つまり、各ノードを新しい行とインデントで書き込みますか?

FileStream fs = new FileStream("myfile.xml", FileMode.Create);

XmlWriter w = XmlWriter.Create(fs);

w.WriteStartDocument();
w.WriteStartElement("myfile");                 

w.WriteElementString("id", id.Text);
w.WriteElementString("date", dateTimePicker1.Text);
w.WriteElementString("version", ver.Text);
w.WriteEndElement();
w.WriteEndDocument();
w.Flush();
fs.Close();
28
Dark Knight

XmlTextWriterの代わりにXmlWriterを使用してから、Indentationプロパティを設定します。

string filename = "MyFile.xml";

using (FileStream fileStream = new FileStream(filename, FileMode.Create))
using (StreamWriter sw = new StreamWriter(fileStream))
using (XmlTextWriter xmlWriter = new XmlTextWriter(sw))
{
  xmlWriter.Formatting = Formatting.Indented;
  xmlWriter.Indentation = 4;

  // ... Write elements
}

@jumboコメントに続いて、これは.NET 2のように実装することもできます。

var filename = "MyFile.xml";
var settings = new XmlWriterSettings() 
{
    Indent = true,
    IndentChars = "    "
}

using (var w = XmlWriter.Create(filename, settings))
{
    // ... Write elements
}
41
Dennis

最初にインデントを指定するXmlWriterSettingsオブジェクトを作成する必要があります。次に、XmlWriterを作成するときに、パスの後にXmlWriterSettingsを渡します。

さらに、usingブロックを使用してC#にリソースの破棄を処理させるため、例外によってリソースが失われることを心配する必要がありません。

{
  XmlWriterSettings xmlWriterSettings = new XmlWriterSettings()
  {
    Indent = true,
    IndentChars = "\t",
    NewLineOnAttributes = true
  };

  using (XmlWriter w= XmlWriter.Create("myfile.xml", xmlWriterSettings))
  {
    w.WriteStartDocument();
    w.WriteStartElement("myfile");

    w.WriteElementString("id", id.Text);
    w.WriteElementString("date", dateTimePicker1.Text);
    w.WriteElementString("version", ver.Text);
    w.WriteEndElement();
    w.WriteEndDocument();
  }
}
28
Ryan Masters

設定プロパティを確認します。

w.Settings.Indent = true;

編集:直接設定することはできません:

System.Xml.XmlWriter.Create("path", new System.Xml.XmlWriterSettings())
7
jvenema

XmlTextWriterのFormattingプロパティを設定します。

TextWriter textWriter;
var xmlTextWriter = new XmlTextWriter(textWriter);
xmlTextWriter.Formatting = Formatting.Indented;
3

次のように設定を使用します。

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Encoding = Encoding.UTF8;
        settings.Indent = true;

        using (MemoryStream memoryStream = new MemoryStream())
        using (XmlWriter xmlDoc = XmlWriter.Create(memoryStream, settings)){
         // logic here..
        }

これにより、必要な場所にアクセスできますが、MemoryStreamを使用する必要はありません。重要な部分は設定です。

2
Amit Shadadi

XmlWriterとXmlWriterSettingsを直接使用したVB.NETの小さなバージョンは、ファイルに直接送信します。

Dim oSerializer As New XmlSerializer(GetType(MyType), New XmlRootAttribute("MyRootAttributeName"))
Using oXmlWriter As XmlWriter = XmlWriter.Create("MyFilePath", New XmlWriterSettings With {.Indent = True}) //Default encoding is utf-8
    oSerializer.Serialize(oXmlWriter, oInstanceOfMyType)
    oXmlWriter.Flush()
End Using

Docoで他の設定とファイル上書きオプションを確認しますが、これはクリーンで、多くの状況で期待どおりに機能します。

0
SteveCinq