2010-06-11 53 views
2

我有以下XML这就需要反序列化/序列化:XML序列化查询

<instance> 
<dog> 
    <items> 
     <item> 
      <label>Spaniel</label> 
     </item> 
    </items> 
</dog> 
<cat> 
    <items> 
     <item> 
      <label>Tabby</label> 
     </item> 
    </items> 
</cat> 
</instance> 

我不能改变的XML结构。

我需要这个映射到以下类:

[Serializable, XmlRoot("instance")] 
public class AnimalInstance 
{ 
    public string Dog { get; set; } 
    public string Cat { get; set; } 
} 

我真的不知道从哪里在这一个开始,而无需手动解析XML。我想保持代码尽可能简短。有任何想法吗? (不,我的项目实际上并不涉及猫和狗)。

回答

6

一个简单的工作示例(跳跃的简洁猫):

using System.Collections.Generic; 
using System.IO; 
using System.Xml.Serialization; 

[XmlRoot("instance")] 
public class AnimalInstance { 
    [XmlElement("dog")] 
    public Dog Dog { get; set; } 
} 

public class Dog { 
    [XmlArray("items")] 
    [XmlArrayItem("item")] 
    public List<Item> Items = new List<Item>(); 
} 

public class Item { 
    [XmlElement("label")] 
    public string Label { get; set; } 
} 

class Program { 
    static void Main(params string[] args) { 
     string xml = @"<instance> 
<dog> 
    <items> 
     <item> 
      <label>Spaniel</label> 
     </item> 
    </items> 
</dog> 
</instance>"; 

     XmlSerializer xmlSerializer = new XmlSerializer(typeof(AnimalInstance)); 
     AnimalInstance instance = (AnimalInstance)xmlSerializer.Deserialize(new StringReader(xml)); 
    } 
} 
+0

好的建议。我最终用得非常多,但是我在'AnimalInstance'内嵌套了所有的类,所以它们没有明显暴露。 – 2010-06-11 09:15:00

+0

@David Neale:如果你不希望你的类被公开,你可以创建一个序列化程序集并使用InternalsVisibleToAttribute:检查这个问题http://stackoverflow.com/questions/2262957/serialize-list-of-类声明与内部修饰符 – 2010-06-11 09:33:49

0

那么你可以使用System.Xml.Serialization通过IXmlSerializable的界面做自定义序列得到的结构,只要你想

+0

确实 - 但我希望没有编写自定义代码来解析XML可能会有更好的方法。 – 2010-06-11 08:36:21

2

为什么会出现这样的问题编写自定义解析代码?为您简单的例子,它实际上可能牵涉较少的代码使用一个XDocument:

XDocument xdoc = XDocument.Parse(xml); 
AnimalInstance animal = new AnimalInstance() 
{ 
    Dog = xdoc.XPathSelectElement("instance/dog/items/item/label").Value, 
    Cat = xdoc.XPathSelectElement("instance/cat/items/item/label").Value 
}; 
+0

序列化将需要更多的工作; +1,从我这里,顺便:) – 2010-06-11 08:55:12

+0

好的建议。这次我会选择Paolo的答案,因为我需要序列化和反序列化。 – 2010-06-11 09:13:41

0

您也可以转换使用XSL将XML文档你喜欢的结构化和并行化这一转变的输出。但是对于如此简单的结构,您应该使用另一种解决方案,如Paolo Tedesco提供的解决方案。

1

当与创建XML序列化类的疑问,我找到解决问题的最简单方法是:

  • 转储所有的虚拟数据到XML文件
  • 运行XSD.EXE创建在您的架构文件的.xsd架构文件
  • 运行XSD.EXE创建一个类文件

我在博客中写了一篇关于它的快速教程发布前一阵子: http://www.diaryofaninja.com/blog/2010/05/07/make-your-xml-stronglytyped-because-you-can-and-its-easy

它需要不到一分钟的时间,然后你可以轻松地从那里调整的东西。 XSD.exe是你的的朋友

+0

非常好的一点。 +1 – 2010-06-18 08:45:26