yotiky Tech Blog

とあるエンジニアの備忘録

C# - XmlWriter の使い方

learn.microsoft.com

適用対象は、.NET Framework 1.1 以降。

目次

検証環境

  • LINQPad 7
  • .NET 7.0

XmlWriter の使い方

ファイルに書き込む

    var path = @"C:\Workspace\LINQPad Queries\XML\PurchaseOrder_copy.xml";

    var settings = new XmlWriterSettings
    {
        OmitXmlDeclaration = true,
        Indent = true,
    };

    using (var xw = XmlWriter.Create(path, settings))
    {
        xw.WriteStartElement("PurchaseOrder");
        xw.WriteAttributeString("PurchaseOrderNumber", "99503");
        xw.WriteAttributeString("OrderDate", "1999-10-20");
        xw.WriteStartElement("Address");
        xw.WriteAttributeString("Type", "Shipping");
        xw.WriteElementString("Name", "Ellen Adams");
        xw.WriteElementString("Street", "123 Maple Street");
        xw.WriteElementString("City", "Mill Valley");
        xw.WriteElementString("State", "CA");
        xw.WriteElementString("Zip", "10999");
        xw.WriteElementString("Country", "USA");
        xw.WriteEndElement();
        xw.WriteEndElement();
    };

実行結果。

<PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
  <Address Type="Shipping">
    <Name>Ellen Adams</Name>
    <Street>123 Maple Street</Street>
    <City>Mill Valley</City>
    <State>CA</State>
    <Zip>10999</Zip>
    <Country>USA</Country>
  </Address>
</PurchaseOrder>
  • 上から逐次書き込む
  • OmitXmlDeclaration を設定するとXML宣言を除外できる
  • Indent を設定しないと改行もインデントも含まれない連結した文字列が書き出される
  • 子要素がある場合は、WriteStartElementWriteEndElementで処理を囲む
  • 子要素がなく値を持つタグなら、WriteElementString
  • 属性は、WriteAttributeString

string に書き込む

XmlWriterSettingsAsync を true して設定することで非同期で呼び出せる。

    var settings = new XmlWriterSettings
    {
        Async = true,
        Indent = true,
    };

    using (var sr = new StringWriter())
    using (var xw = XmlWriter.Create(sr, settings))
    {
        await xw.WriteStartElementAsync("x", "root", "http://ns");
        xw.WriteStartElement("PurchaseOrder");
        xw.WriteAttributeString("PurchaseOrderNumber", "99503");
        xw.WriteAttributeString("OrderDate", "1999-10-20");
        xw.WriteStartElement("Address");
        xw.WriteAttributeString("Type", "Shipping");
        xw.WriteElementString("Name", "Ellen Adams");
        xw.WriteElementString("Street", "123 Maple Street");
        xw.WriteElementString("City", "Mill Valley");
        xw.WriteElementString("State", "CA");
        xw.WriteElementString("Zip", "10999");
        xw.WriteElementString("Country", "USA");
        xw.WriteEndElement();
        xw.WriteEndElement();
        await xw.WriteEndElementAsync();
        xw.Close();
        
        sr.ToString().Dump();
    }

実行結果。

<?xml version="1.0" encoding="utf-16"?>
<x:root xmlns:x="http://ns">
  <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
    <Address Type="Shipping">
      <Name>Ellen Adams</Name>
      <Street>123 Maple Street</Street>
      <City>Mill Valley</City>
      <State>CA</State>
      <Zip>10999</Zip>
      <Country>USA</Country>
    </Address>
  </PurchaseOrder>
</x:root>

基本のキ

文字列をファイルに書き込む

    var xml =
@"<PurchaseOrder PurchaseOrderNumber=""99503"" OrderDate=""1999-10-20"">
  <Address Type=""Shipping"">
      <Name>Ellen Adams</Name>
      <Street>123 Maple Street</Street>
      <City>Mill Valley</City>
      <State>CA</State>
      <Zip>10999</Zip>
      <Country>USA</Country>
  </Address>
</PurchaseOrder>";

    var path = @"C:\Workspace\LINQPad Queries\XML\PurchaseOrder_copy.xml";

    using (var sw = new StreamWriter(path, false, Encoding.UTF8))
    {
        sw.Write(xml);
    };

参考

XmlWriterSettings を細かく解説してくれてるサイト。

smdn.jp