2013-08-01 176 views
3

您能否更加简单地在另一个标签('data')内消除XML('条目'),而无需在'Items'get属性中使用另一个deserilization。 “公共项目[]项目”中可能有某种属性。C#XML反序列化XML中带有属性的XML

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:

[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; 
    } 
+1

你在这种情况下使用'CData'任何理由吗?为什么不让'Items'在没有'Data'属性的情况下正常序列化/反序列化? –

+0

我从另一个系统得到这个CData – sulgpallur

+3

问题是,CData和Data是一个字符串的事实意味着技术上什么是内部数据是一个字符串,而不是XML,所以你不能够反序列化它没有两个步骤。 – Chris

回答

0

之前反序列化XML,加载XML到XmlDocument的和变化的 “数据” XmlNode的InnerXml如下:

if (xmlNode.Contains("<![CDATA[") || xmlNode.InnerXml.Contains("&lt;")) 
{ 
    xmlNode.InnerXml = xmlNode.Value; 
} 

这将工作如果你知道你将在CDATA内部收到什么。