2010-01-24 104 views
2

我想弄清楚如何做XML序列化。XML序列化如何知道将属性放在哪里?

这是我多么希望我的XML文档太像到底

<course> 
    <name></name> 
    <backgroundColor></backgroundColor> 
    <fontColor></fontColor> 
    <sharingKey></sharingKey> 
    <task id=""> 
     <taskName></taskName> 
     <description></description> 
    </task> 
    <task id=""> 
     <taskName></taskName> 
     <description></description> 
    </task> 
</course> 

到目前为止,我的样子

<?xml version="1.0" encoding="utf-8"?> 
<Course xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <name>name</name> 
    <backgroundColor>test</backgroundColor> 
    <fontColor>test2</fontColor> 
    <sharingKey>9324bfab-6cc7-49e5-84f7-56130b8dc099</sharingKey> 
    <task id="first Task" /> 
    <task id="Second task" /> 
</Course> 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 

namespace ConsoleApplication1 
{ 
    [XmlRoot("Course")] 
    public class MyWrapper 
    { 
     public MyWrapper() 
     { 
      TaskList = new List<Tasks>(); 
     } 

     [XmlElement("name")] 
     public string Name { get; set; } 

     [XmlElement("backgroundColor")] 
     public string BackgroundColor { get; set; } 

     [XmlElement("fontColor")] 
     public string FontColor { get; set; } 

     [XmlElement("sharingKey")] 
     public Guid SharingKey { get; set; } 

     [XmlElement("task")] 
     public List<Tasks> TaskList { get; set; } 

    } 


    public class Tasks 
    { 
     [XmlAttribute("id")] 
     public string Id { get; set; } 
    } 

} 


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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      Tasks task = new Tasks(); 
      task.Id = "first Task"; 

      Tasks task2 = new Tasks(); 
      task2.Id = "Second task"; 

      MyWrapper wrap = new MyWrapper(); 
      wrap.BackgroundColor = "test"; 
      wrap.FontColor = "test2"; 
      wrap.Name = "name"; 
      wrap.SharingKey = Guid.NewGuid(); 

      wrap.TaskList.Add(task); 
      wrap.TaskList.Add(task2); 

      SerializeToXML(wrap); 
     } 

     static public void SerializeToXML(MyWrapper list) 
     { 
      XmlSerializer serializer = new XmlSerializer(typeof(MyWrapper)); 


     TextWriter textWriter = new StreamWriter(@"C:\New folder\test.xml"); 
     serializer.Serialize(textWriter, list); 
     textWriter.Close(); 
    } 
} 

}

所以我的问题是与“ID “为了这个任务。

我只有在它与该另一个类

[XmlAttribute("id")] 
public string Id { get; set; } 

它怎么知道把这个属性在任务标签?

,如果我想有另一个属性

[XmlElement()] 
public string TaskName {get; set;} 

说我想和这个元素的属性会发生什么我怎么会确保该属性将与TASKNAME不工作?

回答

2
[XmlElement("task")] 
public List<Tasks> TaskList { get; set; } 

这部分代码告诉它在一个名为“task”的元素中每一个对象都有一个序列号。序列化程序查看Tasks类中的属性,并找到Id属性,该属性标记为[XmlAttribute("id")],因此它被序列化为对象的“task”元素的属性。

我不知道我理解你的第二个问题。您不能将元素添加到元素,因为它的类型是字符串。相反,您将不得不创建一个新类来包装任务名称的概念,该名称将具有名称属性以及任何其他您希望添加到其中的属性。

+0

哦,我不知道它是什么类型,但如果我手动编写xml文档没有什么会阻止我做因此,对于C#序列化,我需要创建一个新的类和环绕那个?我可以看到一个例子,如果你需要将所有东西都包裹起来,那么看起来东西可能会变得很快混乱。 – chobo2 2010-01-24 06:13:05

+0

这与您已经使用MyWrapper类完成的工作没有什么不同。如果你有一个复合类型,只需创建一个类来表示它。在你的情况下,任务名称是一个字符串和ID号,因此创建一个名为TaskName的类,其中包含一个字符串和ID号。 – 2010-01-24 12:59:45

+0

我的意思是说,每次你需要一个新的复合类型时,你都需要创建一个新类。所以如果你有许多复合类型,你将不得不使用X个类来查看整个代码。 – chobo2 2010-01-24 19:54:45

0

基本上:XML元素可以有两种属性,属性和元素。您定义了一个XML元素tasktask上的一个属性id,因此序列化程序将该属性添加到task

现在,假设你想添加元素来驻留在task - 这也没关系,正如我所说的,XML元素可以包含其他元素或者具有属性。只需在task ...内定义您想要包含的任何元素即可。task

如果要将属性附加到其他元素,则需要创建一个新的XML元素(此处对应于一个类),并使用[XmlAttribute("id")]语法从字面上将其设置为属性类型。当你定义最简单的元素形式时,我们可以称之为simpleType,它的值可以是Strings或Integers,或者任何一种相对原始的类型(日期是有效的也是)。但是如果你想让同样的元素也具有属性,它突然需要变成一个complexType,因为它具有complexContent - 它可能包含简单的内容和属性,比如说属性。

看看如何编写XML模式 - w3schools有一些excellent tutorials - 我认为您将更好地理解简单和复杂内容的整体组合。实际上,通过为您的类定义XML序列化,您还定义了一个XML模式;实际上你可以将你的代码编译成这样的模式。了解构建模式将让您了解如何构建代码以生成适当的模式,并且了解您的序列化输出。

+0

嗯所以如果你想要这个“所谓的”复杂的类型,你总是要做一个新班级?如果你有很大的xml文件,我会觉得这会很麻烦。你可能会喜欢50个班,其中有几条线。然后,你必须追捕所有这些复杂的类型,并试图找到它的照片。 – chobo2 2010-01-24 20:23:32

+0

@ chobo2:对。另一种方法是从问题的另一端开始,定义一个模式,并让架构生成您的代码。对于Java而言,有一种叫做JAXB的功能,可以为你做到这一点...现在我将查找C#等价物。 – 2010-01-24 20:27:51

+0

@ chobo2:http://stackoverflow.com/questions/765422/jaxb-equivalent-in-c从XML模式生成C#有一些很好的链接。如果你关心生成很多C#类的详细程度,你可能会发现该模式更简洁地描述了同样的事情。 – 2010-01-24 20:31:20