0

次のようなサードパーティ API からの XML があります。

<root>
  <Data>
    <sub_id>3</sub_id>
    <email>something@something.test</email>
  </Data>
  <Data>
    <sub_id>7</sub_id>
    <email>test@what.biz</email>
  </Data>
</root>

そして、次のようなクラスにデシリアライズしたいと思います:

public class root
    {
        //[XmlArray("Datas")]
        [XmlArrayItem("Data", typeof(Data))]
        public Data[] Data { get; set; }
    }

    public class Data
    {
        public int subscriber_id { get; set; }
        public string email { get; set; }
    }

しかし、もちろんこれはうまくいきません。「データ」要素の配列をラップする要素を挿入すると、コメントアウトした「データ」行が修正されますが、できません。私が言ったように、この XML はサードパーティ (XML の仕組みが少し緩いもの) からのものです。

これは、いくつかの異なる C# コード/属性で実行可能ですか?

4

2 に答える 2

1

クラス ルートを削除し、配列自体をデシリアライズします (また、クラス Data の subscriber_id を sub_id に名前変更します)。ここにコードがあります

var serializer = new XmlSerializer(typeof(Data[]), new XmlRootAttribute("root"));
            Data[] datas;
            using (var tr = new StringReader(xml))
            {
                datas = (Data[])serializer.Deserialize(tr);
            }

ただし、デシリアライゼーションだけが必要で、ソース xml 形式がそれと同じくらい単純な場合は、XLinq を使用して解析できます。より効率的です (私のマシンで 100 万回のデシリアライゼーションで 10 秒対 20 秒):

var xml =
@"<root>
  <Data>
    <sub_id>3</sub_id>
    <email>something@something.test</email>
  </Data>
  <Data>
    <sub_id>7</sub_id>
    <email>test@what.biz</email>
  </Data>
</root>";
var xdoc = XDocument.Parse(xml);
foreach (var dataElem in xdoc.Root.Elements("Data"))
{
    var subId = int.Parse(dataElem.Element("sub_id").Value);
    var email = dataElem.Element("email").Value;
}
于 2012-07-27T02:15:51.873 に答える
0

xml の形式は正しくありません。[XmlElement]の代わりに使用するだけです[XmlArray]。例:

[XmlRoot("root")]
    public class Root
    {
        [XmlElement]
        public Data[] Data { get; set; }
    }

    public class Data
    {
        [XmlElement("sub_id")]
        public int SubscriberId { get; set; }

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

あなたのサンプルで上記をテストしたところ、問題なくロードされました。

于 2013-04-27T07:35:30.453 に答える