2012-02-28 148 views
0

反序列化到I型有XML的下面一段:XML基於屬性

<values> 
<value type="A"> 
<something>ABC</something> 
<something-else>DEF</something-else> 
</value> 
<value type="B"> 
<something-different>ABC</something-different> 
<something-complex> 
<id>B</id> 
<name>B</name> 
</something-complex> 
</value> 

我將如何創建C#代碼反序列化這正常嗎? 一般情況下我做這樣的事情:

public class A 
{ 
    [XmlElement("something")] 
    public string Something { get; set; } 
    [XmlElement("something-else")] 
    public string SomethingElse { get; set; }  
} 

public class B 
{ 
    [XmlElement("something-different")] 
    public string SomethingDifferent { get; set; }  
    [XmlElementAttribute("something-complex")] 
    public B_ID SomethingComplex { get; set; } 
} 
public class B_ID 
{ 
    [XmlElement("id")] 
    public int ID { get; set; } 
    [XmlElement("something-else")] 
    public string Name { get; set; }  
} 

但我不知道怎麼當的要素具有相同的名稱但不同的內容使用此基礎上的屬性。

+0

如果什麼都行不通,您可以隨時手動完成 - 使用XDocument它不會佔用太多代碼。 – user1096188 2012-02-28 13:11:05

回答

-2

了不少心思後,爲解決這個最簡單的方法,就是隻是做一個快速的文本上的數據替換,以XML轉換成:

<values> 
<value-a> 
<something>ABC</something> 
<something-else>DEF</something-else> 
</value-a> 
<value-b> 
<something-different>ABC</something-different> 
<something-complex> 
<id>B</id> 
<name>B</name> 
</something-complex> 
</value-b> 
1

你不能用標準的基於屬性的序列化來做到這一點,你將不得不編寫自己的代碼來解析文檔並相應地創建對象。

非常簡單,但工作示例:

using System.Xml; 

class A { 
    public string Something { get; set; } 
} 
class B { 
    public string SomethingDifferent { get; set; } 
} 

class Program { 

    const string xml = @" 
<values> 
    <value type='A'> 
    <something>ABC</something> 
    </value> 
    <value type='B'> 
    <something-different>ABC</something-different> 
    </value> 
</values> 
"; 

    static void Main(string[] args) { 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(xml); 

     foreach (XmlNode node in doc.SelectNodes("/values/value")) { 
      string type = node.Attributes["type"].Value; 
      switch (type) { 
      case "A": 
       A a = new A(); 
       foreach (XmlNode propertyNode in node.ChildNodes) { 
        switch (propertyNode.Name) { 
        case "something": 
         a.Something = propertyNode.InnerText; 
         break; 
        } 
       } 
       break; 
      case "B": 
       // etc ... 
       break; 
      } 
     } 

    } 
} 
+0

問題是我正在處理自行遞歸的複雜類型。 – NKCSS 2012-02-28 14:26:49

+0

@NKCSS:這只是一個例子,但你可以很好地擴展它來處理遞歸。 – 2012-02-28 14:28:18