c# - 使用命名空间和多个嵌套元素反序列化 XML

标签 c# xml

我正在尝试反序列化以下 xml

<?xml version="1.0" encoding="utf-8"?>
<ns2:myroot xmlns:ns2="http://jeson.com/">
  <item>
    <name>uno</name>
    <price>1.25</price>
  </item>
  <item>
    <name>dos</name>
    <price>2.30</price>
  </item>
</ns2:myroot>

用这些类

public class item
{
    [XmlElement(Namespace="")]
    public string name { get; set; }

    [XmlElement(Namespace = "")]
    public double price { get; set; }
}

[XmlRoot("myroot", Namespace="http://jeson.com/")]  //This was http://jeson.com, no slash at the end.
public class myrootNS
{
    [XmlElement(Namespace = "")]
    public item[] item { get; set; }
}

使用这个方法

XmlSerializer serializer = new XmlSerializer(typeof(T), "http://jeson.com/");
XmlReaderSettings settings = new XmlReaderSettings();
using (StringReader textReader = new StringReader(xml))
{
    using (XmlReader xmlReader = XmlReader.Create(textReader, settings))
    {
        return (T)serializer.Deserialize(xmlReader);
    }
}

但不知何故我不断收到此错误。

System.InvalidOperationException: There is an error in XML document (2, 2). ---> 
System.InvalidOperationException: <myroot xmlns='http://jeson.com/'> was not expected.

正确的做法是什么?该方法适用于没有命名空间的反序列化。

最佳答案

问题是 myrootNS 类的命名空间不正确,因为它与 XML 中预期的命名空间不匹配。

[XmlRoot("myroot", Namespace = "http://jeson.com/")]
public class myrootNS
{
    [XmlElement(Namespace = "")]
    public item[] item { get; set; }
}

请注意,Namespace 属性值有一个尾随 /。这是我的反序列化方法:

static T Deserialize<T>(string xml)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    XmlReaderSettings settings = new XmlReaderSettings();
    using (StringReader textReader = new StringReader(xml))
    {
        using (XmlReader xmlReader = XmlReader.Create(textReader, settings))
        {
            return (T)serializer.Deserialize(xmlReader);
        }
    }
}

关于c# - 使用命名空间和多个嵌套元素反序列化 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27365029/

相关文章:

xml - 使用 Notepad++ 进行内部 DTD 验证

c# - 使用 C# 按 Alpha.Numeric 对 XML 节点进行排序

c# - 这如何不导致堆栈溢出?

c# - 创建唯一标识符,它是父标识符的可识别子标识符

c# - 使用 Google 登录 - 我们如何验证 .net 中的 Google ID token 服务器端?代码示例缺失,库似乎已弃用

c# - 如何使用进程 ID 获取 Excel 实例或 Excel 实例 CLSID?

c# - 当进行非常大的插入时,不参数化 MySQL 查询而是使用方法 MySqlHelper.EscapeString(string) 是否安全?

c# - 如何从流中将新元素附加到 Xml

java - Android 字符串问题 : How can I centralize all strings within my app?

xml - 使用 XSLT 合并两个 XML 文件