5

私はそのようなXmlを持っています

            <pda:Party>
                 ...Snip....
                <pda:CitizenName>
                    <pda:CitizenNameTitle>MR</pda:CitizenNameTitle>
                    <pda:CitizenNameForename>John</pda:CitizenNameForename>
                    <pda:CitizenNameSurname>Wayne</pda:CitizenNameSurname>
                </pda:CitizenName>
              .....Snip...
           </pda:Party>

Citizen Name は Party Node 内の複雑なタイプです。(これは、アダプターを作成しているサードパーティの統合から受け取った xml です)

クラスに逆シリアル化しようとしているサブタイプがあることに興味はありません。

public class Party
{
    public string  FirstName { get; set; }
    public string LastName {get;set;}

}

したがって、クラス定義を XML が表すものの具体的な定義として持つのではなく、プロパティを XPath のようなもので装飾できます。

 [XmlElement("\CitizenName\CitizenNameForeName")]
 public string FirstName {get;set;}

xml から、興味のあるデータを含むクラスに情報を選択するには?

サードパーティから受け取った xml は非常に冗長で、特定の側面にのみ関心があります。1 つのオプションは、XMLDocument を作成し、XPath と変換メソッドを使用して手動でクラスにマップすることですが、中間の解決策がある場合に備えて質問すると思いましたか?

4

2 に答える 2

0

最後に、やりたいことを実行するために独自の属性を設定しました。したがって、XPath パスを取るカスタム属性は...

[System.AttributeUsage(System.AttributeTargets.Property)]
public class PathToXmlNode : System.Attribute
{
    public string Path { get; set; }

    public PathToXmlNode(string path)
    {
        this.Path = path;
    }
}

装飾されたプロパティが続きます.. (簡単にするために名前空間は省略されています)

         [PathToXmlNode("Party[1]/CitizenName/CitizenNameForename")]
         public string FirstName { get; set; }

次に、クラスにデータを入力したいときに、次のメソッドを呼び出しました。

        var type = typeof(T);
        foreach (var property in type.GetProperties())
        {
            var attributes = property.GetCustomAttributes(typeof(PathToXmlNode), true);

            if (attributes != null && attributes.Length > 0)
            {
                //this property has this attribute assigned.
                //get the value to assign
                var xmlAttribute = (PathToXmlNode)attributes[0];
                var node = doc.SelectSingleNode(xmlAttribute.Path, nmgr);


                if (node != null && !string.IsNullOrWhiteSpace(node.InnerText))
                {
                    dynamic castedValue;

                    if (property.PropertyType == typeof(bool))
                    {
                        castedValue = Convert.ToBoolean(node.InnerText);
                    }
                    ...Snip all the casts....
                    else
                    {
                        castedValue = node.InnerText;
                    }


                    //we now have the node and it's value, now set it to the property.
                    property.SetValue(obj, castedValue, System.Reflection.BindingFlags.SetProperty, null, null, System.Globalization.CultureInfo.CurrentCulture);
                }

            }
        }

これは良い出発点ですが、他の誰かがこれを実行可能な中間ソリューションと見なす場合は、非単純なデータ型に適応する必要があることに注意する必要があります。それが私が今やろうとしていることです!

于 2013-01-03T08:45:33.160 に答える
0

1 つのオプションは、XSLT 変換を使用して、着信 XML をクラスに一致する s 形式に解析することです。

于 2013-01-02T14:29:54.567 に答える