1. ホーム
  2. c#

[解決済み】C#でXMLをビルドするにはどうしたらいいですか?

2022-03-24 08:29:58

質問

C#で有効なXMLを生成するにはどうしたらいいですか?

どのように解決するのですか?

シナリオに依存します。 XmlSerializer は確かに一つの方法であり、オブジェクトモデルに直接マッピングできるという利点があります。.NET 3.5では XDocument 等も非常に親切です。もし、サイズが非常に大きい場合は XmlWriter はあなたの味方です。

には XDocument の例です。

Console.WriteLine(
    new XElement("Foo",
        new XAttribute("Bar", "some & value"),
        new XElement("Nested", "data")));

あるいは、同じように XmlDocument :

XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);

を書いている場合 ストリームを使用する場合、DOM のアプローチ(たとえば XmlDocument / XDocument など)は、すぐに多くのメモリを消費してしまいます。ですから、もし100MBのXMLファイルを CSV を考慮する必要があります。 XmlWriter これはより原始的(ライトワンス・ファイアホース)ですが、非常に効率的です(ここで大きなループを想像してみてください)。

XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();

最後に XmlSerializer :

[Serializable]
public class Foo
{
    [XmlAttribute]
    public string Bar { get; set; }
    public string Nested { get; set; }
}
...
Foo foo = new Foo
{
    Bar = "some & value",
    Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);

これはクラスなどにマッピングするのに適したモデルです。しかし、単純なことをする場合(あるいは目的のXMLがオブジェクトモデルと直接の相関を持たない場合)には、やりすぎかもしれません。のもう一つの問題は XmlSerializer は、イミュータブルな型のシリアライズを好まないということだ。 セッターを実装していない限り)。 IXmlSerializable を使ってもあまり意味がありません。 XmlSerializer ).