📢 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> | ||