0

一部の xml を逆シリアル化しようとしていますが、取得元のサード パーティが特定のタグを複数の方法でフォーマットしています。以下の例では、値タグです。詳細情報を含む文字列または複数の内部タグを持つことができます

できれば、これが自動的に行われ、この種のコード構造に従い続けたいと思います

[XmlRoot(ElementName = "ContactField")]
public class ContactField
{
    [XmlElement("id")]
    public int id { get; set; }

    [XmlElement("type")]
    public string type { get; set; }

    [XmlElement("value")]
    public FieldValue values { get; set; }

}

XmlSerializer を使用して、その内容に基づいてタグを異なる方法で処理する方法はありますか?それとも、手動で行うのに行き詰まるのでしょうか?

<contact>
        <isConnection>false</isConnection>
        <id>62</id>
        <fields>
            <id>8</id>
            <type>id</type>
            <value>test@test.com</value>
            <editedBy>OWNER</editedBy>
        </fields>
        <fields>
            <id>95</id>
            <type>notes</type>
            <value>Dummy user for testing</value>
            <editedBy>OWNER</editedBy>
        </fields>
        <fields>
            <id>96</id>
            <type>birthday</type>
            <value>
                <day>11</day>
                <month>5</month>
                <year>1988</year>
            </value>
            <editedBy>OWNER</editedBy>
        </fields>
</contact>
4

1 に答える 1

2

クラスを次のように定義することで達成できると思います

   [XmlRoot(ElementName = "contact")]
   public class ContactField
        {
            [XmlElement("id")]
            public int id { get; set; }

            [XmlElement("type")]
            public string type { get; set; }

            [XmlElement("fields")]
            public Field[] fields { get; set; }
        }

        public class Field
        {
            [XmlElement("value")]
            public SubField SubField { get; set; }
        }

        public class SubField
        {
            [XmlText]
            public String Value { get; set; }

            [XmlElement("day")]
            public String Day { get; set; }

            [XmlElement("month")]
            public String Month { get; set; }

            [XmlElement("year")]
            public String Year { get; set; }
        }

このように使用してテストしました

    String xml = @"<contact>
        <isConnection>false</isConnection>
        <id>62</id>
        <fields>
            <id>8</id>
            <type>id</type>
            <value>test@test.com</value>
            <editedBy>OWNER</editedBy>
        </fields>
        <fields>
            <id>95</id>
            <type>notes</type>
            <value>Dummy user for testing</value>
            <editedBy>OWNER</editedBy>
        </fields>
        <fields>
            <id>96</id>
            <type>birthday</type>
                <value><day>11</day>
                <month>5</month>
                <year>1988</year></value>
            <editedBy>OWNER</editedBy>
        </fields>
</contact>";
var xmlSerializer  = new XmlSerializer(typeof (ContactField));
   using (var stringReader = new StringReader(xml))
   {
        var contactField = (ContactField) xmlSerializer.Deserialize(stringReader);
   }
于 2013-09-17T21:49:19.813 に答える