如何为此创建序列化类?

时间:2010-05-03 23:53:34

标签: c# .net xml xml-serialization

我有这样的事情(对不好的名字感到抱歉)

   <?xml version="1.0" encoding="utf-8" ?>
    <root xmlns="http://www.domain.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.domain.com Schema.xsd">
      <product></product>
      <SomeHighLevelElement>
         <anotherElment>
              <lowestElement> </lowestElement>
         </anotherElment>
      </SomeHighLevelElement>
    </root>

我的班级有类似的东西

public class MyClass
{
    public MyClass()
    {
        ListWrapper= new List<UserInfo>();
    }


    public string product{ get; set; }


    public List<SomeHighLevelElement> ListWrapper{ get; set; }


}

public class SomeHighLevelElement
{

    public string lowestElement{ get; set; }
}

但是我不知道如何编写“anotherElement”的代码,不知道我是否必须围绕它编写另一个包装。

修改

我知道在我的实际xml文件中出错。我的标签中有这个

xmlns="http://www.domain.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.Domain.com Schema.xsd

在根行上引发异常,说这个东西有错误。所以我不知道它是否对schemaLocation感到生气,因为我现在正在使用本地主机或者是什么。

错误

System.InvalidOperationException was caught
  Message="There is an error in XML document (2, 2)."
  Source="System.Xml"

1 个答案:

答案 0 :(得分:2)

以下是基于您提供的信息的简单示例。基本上,您需要为anotherElment创建一个单独的类,其中包含string

您可以使用attributes精确控制类如何解析Xml元素,这基本上将您的类属性映射到Xml文件中的元素/属性。例如,由于您提供的示例Xml中的文档元素是root,因此我明确定义MyClass有一个名为root的文档元素以匹配您的Xml。默认情况下,序列化程序将查找名为MyClass的元素,如果省略它,则会抛出deserialize方法。

这应该有助于您前进:

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

[XmlRoot("root")]
public class MyClass
{
    public MyClass()
    {

    }

    public string product { get; set; }

    [XmlElement("SomeHighLevelElement")]
    public List<SomeHighLevelElement> ListWrapper { get; set; }

}

public class SomeHighLevelElement
{
    public AnotherElment anotherElment { get; set; }
}

public class AnotherElment
{
    public string lowestElement { get; set; }
}

基于您提供的Xml的示例测试方法:

using System.Xml;
using System.Xml.Serialization;
using System.IO;
.
.
.
public void Test()
{
    string xml = @"<root>
                  <product>product name</product>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>foo</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>bar</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                  <SomeHighLevelElement>
                    <anotherElment>
                      <lowestElement>baz</lowestElement>
                    </anotherElment>
                  </SomeHighLevelElement>
                </root>";
    MyClass c = Deserialize<MyClass>(xml);
}

public T Deserialize<T>(string xml)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    return (T)serializer.Deserialize(new StringReader(xml));
}