1

我需要反序列化下面的xml。我想使用 xmlserializer 因为我(更)熟悉它。我相信这个 xml 构造不正确,但是我无法更改它。下面表示类别对象的列表。当我尝试使用反序列化

xmlserializer(typeof(List<Category>))

我收到此错误:“不期望类别 xmlns=''”

<?xml version="1.0" encoding="utf-8" ?>
<categories>
  <category id="16" name="Exports" parent_id="13"/>
  <category id="17" name="Imports" parent_id="13"/>
  <category id="3000" name="Income Payments & Receipts" parent_id="13"/>
  <category id="125" name="Trade Balance" parent_id="13"/>
  <category id="127" name="U.S. International Finance" parent_id="13"/>
</categories>

如果这是我必须做的,我不介意制作某种虚拟课程来对这些进行反序列化。这是我的类别类

[XmlType("category")]
 public class Category
 {


    [XmlAttribute("id")]
    public int ID { get; set; }

    [XmlAttribute("parent_id")]
    public int ParentID { get; set; }

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

我的代码:

    XmlSerializer serializer = new XmlSerializer(typeof(List<Category>));
    StringReader reader = new StringReader(xml);
    List<Category> obj = null;

    using (System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(reader))
    {
        obj = (List<Category>)serializer.Deserialize(xmlReader);
    }
        return obj;
4

3 回答 3

3

您可以XmlRootAttribute将“类别”部分传入序列化程序。

但是...您必须从 xml 中删除“&”,因为它无效

XmlSerializer serializer = new XmlSerializer(typeof(List<Category>), new XmlRootAttribute("categories"));

using (FileStream fileStream = new FileStream(@"C:\Test.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    var test = serializer.Deserialize(fileStream);
}

在此处输入图像描述

这是您使用 aString.Replace来整理“&”的方法

    private List<Category> GetCategories(string xmlData)
    {
        List<Category> obj = null;
        XmlSerializer serializer = new XmlSerializer(typeof(List<Category>), new XmlRootAttribute("categories"));
        StringReader reader = new StringReader(xmlData.Replace("&","&amp;"));
        using (System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(reader))
        {
            obj = (List<Category>)serializer.Deserialize(xmlReader);
        }
        return obj;
    }
于 2013-01-29T07:56:12.103 回答
1

尝试创建一个包含您List<Category>这样的类别类:

[XmlRoot("categories")]
public class Categories
{
    public Categories() 
    {
       Items = new List<User>();
    }

    [XmlElement("category")]
    public List<Category> Items {get;set;}
}

您可以像这样创建序列化程序:

XmlSerializer serializer = new XmlSerializer(typeof(Categories));
于 2013-01-29T07:40:37.027 回答
0

您是否有此 XML 应符合的 XSD?如果是这样,您可以使用以下命令生成所需的代码:“xsd your.xsd /classes”

于 2013-01-29T08:52:38.413 回答