您是否可以更简单地反序列化XML('items'),而不使用'Items'属性内的另一个反序列化来获取数据标记内部的内容。也许在“public Item[] Items”上添加某种属性可以实现。
XML:
<body>
<request></request>
<data><![CDATA[ <items> <item> <property1>Name1</property1> <property2>111</property2> </item> <item> <property1>Name2</property1> <property2>222</property2> </item> <item> <property1>Name3</property1> <property2>333</property2> </item> </items>]]>
</data>
</body>
测试类:
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
const string xml = "<body>" +
"<request></request>" +
"<data><![CDATA[" +
"<items>" +
"<item>" +
"<property1>Name1</property1>" +
"<property2>111</property2>" +
"</item>" +
"<item>" +
"<property1>Name2</property1>" +
"<property2>222</property2>" +
"</item>" +
"<item>" +
"<property1>Name3</property1>" +
"<property2>333</property2>" +
"</item>" +
"</items>" +
"]]></data>" +
"</body>";
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
var serializer = new XmlSerializer(typeof (Body));
var response = serializer.Deserialize(new XmlNodeReader(xmlDoc)) as Body;
Assert.IsNotNull(response);
Assert.AreEqual(3, response.Items.Length);
}
}
[Serializable, XmlRoot("body")]
public class Body
{
[XmlElement("request")]
public string Request;
[XmlElement("data")]
public string Data;
public Item[] Items
{
get
{
var document = new XmlDocument();
document.LoadXml(Data);
var serializer = new XmlSerializer(typeof(ItemList));
var response = serializer.Deserialize(new XmlNodeReader(document)) as ItemList;
return response.Items;
}
}
}
[Serializable, XmlRoot("items")]
public class ItemList
{
[XmlElement("item")]
public Item[] Items;
}
[Serializable]
public class Item
{
[XmlElement("property1")]
public string Property1;
[XmlElement("property2")]
public string Property2;
}
CData
有什么原因吗?为什么不让Items
正常地进行序列化/反序列化而不需要Data
属性呢? - Chris SinclairData
setter中写入Items
数组,以避免每次访问Items
属性时进行反序列化。 - Chris Sinclair