📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

332行目: 332行目:
     }
     }
  }
  }
</syntaxhighlight>
<br><br>
== 要素の変更 ==
以下の例では、非同期処理を使用してXMLファイルを読み込み、以下に示す要素を読み込んでいる。<br>
* <Hypocenter> -> <Area> -> <Name>の値をhogeに変更
* <Hypocenter> -> <Area> -> <nowiki><Code></nowiki>のtype属性の値を"99に変更
* 全ての<Observation> -> <IntensityStation> -> <Name>の値をpiyoに変更
<br>
読み込むXMLファイルを以下に示す。<br>
<syntaxhighlight lang="xml">
<!-- 使用するXMLファイル -->
<Earthquake>
  <OriginTime>2024-08-23T21:00:00+09:00</OriginTime>
  <ArrivalTime>2024-08-23T21:01:00+09:00</ArrivalTime>
  <Hypocenter>
    <Area>
      <Name>茨城県南部</Name>
      <Code type="震央地名">301</Code>
    </Area>
  </Hypocenter>
  <jmx_eb:Magnitude type="Mj" description="M3.8">3.8</jmx_eb:Magnitude>
</Earthquake>
<Observation>
  <Pref><Name>茨城県</Name><Code>08</Code><MaxInt>2</MaxInt>
    <Area><Name>茨城県北部</Name><Code>300</Code><MaxInt>2</MaxInt>
      <City><Name>小美玉市</Name><Code>0823600</Code><MaxInt>2</MaxInt>
        <IntensityStation><Name>小美玉市小川*</Name><Code>0823633</Code><Int>2</Int></IntensityStation>
        <IntensityStation><Name>小美玉市上玉里*</Name><Code>0823635</Code><Int>2</Int></IntensityStation>
      </City>
      <City><Name>水戸市</Name><Code>0820100</Code><MaxInt>1</MaxInt>
        <IntensityStation><Name>水戸市千波町*</Name><Code>0820121</Code><Int>1</Int></IntensityStation>
      </City>
    </Area>
  </Pref>
</Observation>
</syntaxhighlight>
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO;
using System.Xml;
using System.Threading.Tasks;
class Program
{
    static async Task Main(string[] args)
    {
      string inputXmlPath = "input.xml";
      string outputXmlPath = "output.xml";
      try
      {
          await ModifyXmlFileAsync(inputXmlPath, outputXmlPath);
      }
      catch (Exception ex)
      {
          Console.WriteLine($"エラーが発生: {ex.Message}");
      }
    }
    static async Task ModifyXmlFileAsync(string inputPath, string outputPath)
    {
      var readerSettings = new XmlReaderSettings { Async = true };
      var writerSettings = new XmlWriterSettings { Async = true, Indent = true };
      using (var reader = XmlReader.Create(inputPath, readerSettings))
      using (var writer = XmlWriter.Create(outputPath, writerSettings))
      {
          await writer.WriteStartDocumentAsync();
          while (await reader.ReadAsync())
          {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                  await ProcessElementAsync(reader, writer);
                  break;
                case XmlNodeType.Text:
                  await writer.WriteStringAsync(reader.Value);
                  break;
                case XmlNodeType.XmlDeclaration:
                case XmlNodeType.ProcessingInstruction:
                  await writer.WriteProcessingInstructionAsync(reader.Name, reader.Value);
                  break;
                case XmlNodeType.Comment:
                  await writer.WriteCommentAsync(reader.Value);
                  break;
                case XmlNodeType.EndElement:
                  await writer.WriteEndElementAsync();
                  break;
                default:
                  await writer.WriteNodeAsync(reader, false);
                  break;
            }
          }
          await writer.WriteEndDocumentAsync();
      }
    }
    static async Task ProcessElementAsync(XmlReader reader, XmlWriter writer)
    {
      if (reader.Name == "Area" && reader.Depth == 3) // Hypocenter -> Area
      {
          await writer.WriteStartElementAsync(reader.Prefix, reader.LocalName, reader.NamespaceURI);
          await ModifyHypocenterAreaAsync(reader, writer);
      }
      else if (reader.Name == "IntensityStation")
      {
          await writer.WriteStartElementAsync(reader.Prefix, reader.LocalName, reader.NamespaceURI);
          await ModifyIntensityStationAsync(reader, writer);
      }
      else
      {
          await writer.WriteStartElementAsync(reader.Prefix, reader.LocalName, reader.NamespaceURI);
          if (reader.HasAttributes)
          {
            await WriteAttributesAsync(reader, writer);
          }
      }
    }
    static async Task ModifyHypocenterAreaAsync(XmlReader reader, XmlWriter writer)
    {
      while (await reader.ReadAsync())
      {
          if (reader.NodeType == XmlNodeType.Element)
          {
            if (reader.Name == "Name")
            {
                await writer.WriteElementStringAsync(reader.Prefix, "Name", reader.NamespaceURI, "hoge");
                await reader.ReadAsync(); // Skip the original content
            }
            else if (reader.Name == "Code")
            {
                await writer.WriteStartElementAsync(reader.Prefix, "Code", reader.NamespaceURI);
                await writer.WriteAttributeStringAsync(null, "type", null, "99");
                await writer.WriteStringAsync(await reader.ReadElementContentAsStringAsync());
                await writer.WriteEndElementAsync();
            }
            else
            {
                await writer.WriteNodeAsync(reader, false);
            }
          }
          else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "Area")
          {
            break;
          }
      }
    }
    static async Task ModifyIntensityStationAsync(XmlReader reader, XmlWriter writer)
    {
      while (await reader.ReadAsync())
      {
          if (reader.NodeType == XmlNodeType.Element)
          {
            if (reader.Name == "Name")
            {
                await writer.WriteElementStringAsync(reader.Prefix, "Name", reader.NamespaceURI, "piyo");
                await reader.ReadAsync(); // Skip the original content
            }
            else
            {
                await writer.WriteNodeAsync(reader, false);
            }
          }
          else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "IntensityStation")
          {
            break;
          }
      }
    }
    static async Task WriteAttributesAsync(XmlReader reader, XmlWriter writer)
    {
      for (int i = 0; i < reader.AttributeCount; i++)
      {
          reader.MoveToAttribute(i);
          await writer.WriteAttributeStringAsync(reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value);
      }
      reader.MoveToElement();
    }
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="xml">
<!-- 使用するXMLファイル -->
<?xml version="1.0" encoding="utf-8"?>
<Earthquake>
  <OriginTime>2024-08-23T21:00:00+09:00</OriginTime>
  <ArrivalTime>2024-08-23T21:01:00+09:00</ArrivalTime>
  <Hypocenter>
    <Area>
      <Name>hoge</Name>
      <Code type="99">301</Code>
    </Area>
  </Hypocenter>
  <jmx_eb:Magnitude type="Mj" description="M3.8">3.8</jmx_eb:Magnitude>
</Earthquake>
<Observation>
  <Pref><Name>茨城県</Name><Code>08</Code><MaxInt>2</MaxInt>
    <Area><Name>茨城県北部</Name><Code>300</Code><MaxInt>2</MaxInt>
      <City><Name>小美玉市</Name><Code>0823600</Code><MaxInt>2</MaxInt>
        <IntensityStation><Name>piyo</Name><Code>0823633</Code><Int>2</Int></IntensityStation>
        <IntensityStation><Name>piyo</Name><Code>0823635</Code><Int>2</Int></IntensityStation>
      </City>
      <City><Name>水戸市</Name><Code>0820100</Code><MaxInt>1</MaxInt>
        <IntensityStation><Name>piyo</Name><Code>0820121</Code><Int>1</Int></IntensityStation>
      </City>
    </Area>
  </Pref>
</Observation>
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>