9

異なるルート要素を持つ複数の XML ファイルがありますが、同じタイプの子要素があり、異なるルート要素を保持する単一のクラスと、各子要素を保持する別のクラスを作成できるようにしたいと考えています。XML ファイルがどのように見えるかを示す 2 つの例を次に示します。

ファイル 1:

<?xml version="1.0" encoding="utf-8" ?>
<Sandra>
  <Address>
    <Street></Street>
    <Number></Number>
  </Address>
</Sandra>

ファイル 2:

<?xml version="1.0" encoding="utf-8" ?>
<John>
  <Address>
    <Street></Street>
    <Number></Number>
  </Address>
</John>

次のように、2 つのクラスだけを使用して、これをシリアル化および逆シリアル化できるようにしたいと考えています。

[Serializable]
[XmlRoot]
public class Person
{
    [XmlElement("Address")]
    public List<Address> Adresses { get; set; }
}

[Serializable]
public class Address
{
    public string Street { get; set; }

    public string Number { get; set; }
}

私はそれらを読んでみました:

    var ser = new XmlSerializer(typeof(Person));
    var reader = XmlReader.Create("person1.xml");
    var person = (Person)ser.Deserialize(reader);

しかし、デシリアライザーはorではなくルート要素を"There is an error in XML document (2, 2)."期待していたため、 が得られます。に変更すると問題なく動作しますが、それはまさにここで避けようとしていることです。<"Person"><"John"><"Paul">[XmlRoot][XmlRoot("John")]

また、同じ奇妙な XML 構造を使用してシリアル化する必要があるため、ルート要素名を Person クラス内に格納する必要があります。

独自の(デ)シリアライザーを簡単に作成できることはわかっていますが、既存の方法を使用してそれを実現できるかどうかを知りたいです。

編集 1: (ロールバック)。

編集 2:必要なものを達成するためのより簡単な方法を見つけたので、「編集 1」の変更をロールバックしました。以下の私の答えを見てください。

4

4 に答える 4