【问题标题】:Deserialize xml element that is empty but has attributes反序列化为空但具有属性的 xml 元素
【发布时间】:2012-05-09 03:24:29
【问题描述】:

我有一些带有如下元素的 XML:

<hour base_forecast="12" datim="29/0" />

我收到错误:

Unexpected node type Element. ReadElementString method can only be 
called on elements with simple or empty content.

我猜这是因为元素没有价值。我不控制这个 XML,所以我不能改变它。我将如何反序列化它?

** 编辑 **

其中一个属性的值是 ">6" .... 这可能是罪魁祸首吗?如果是这样,我该如何处理?

** 更新**

在属性值中发现了一些未返回 > 的数据。发生同样的错误。

** 编辑 #3 * 为我收到的 XML 创建了一个 XSD,然后使用 xsd 工具为它们生成了类。添加到这篇文章的底部。

这里是反序列化代码:

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("xxx");
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        WeatherData Result = new WeatherData();

        using (Stream st = resp.GetResponseStream())
        {
            XmlRootAttribute xRoot = new XmlRootAttribute();
            xRoot.ElementName = "model_data";
            xRoot.IsNullable = true;

            Result = new XmlSerializer(typeof(WeatherData), xRoot).Deserialize(st) as WeatherData;  ** Error here

Xml 返回:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE observation SYSTEM "http://private.com/hithere.dtd">
<model_data>
     <site a="28/12" b="KXXX">
         <hour x="-9999" y="-9999" z="-9999"/>
     </site>
</model_data>

数据对象

[Serializable, XmlRoot("model_data")]
public class WeatherData
{
    [XmlElement("site")]
    public string City { get; set; }

    [XmlAttribute]
    public string a { get; set; }

    [XmlAttribute]
    public string b { get; set; }

    [XmlElement(ElementName="hour", IsNullable=true)]
    public string Hour { get; set; }

    [XmlAttribute]
    public string x { get; set; }

    [XmlAttribute]
    public string y { get; set; }

    [XmlAttribute]
    public string z { get; set; }

}

XSD 工具生成的类

**Removed generated classes, but they are similar to what Hugo posted **

【问题讨论】:

  • 您是否可能从&lt;hour&gt; 的父级调用ReadElementString,或者您的读者不在您认为的位置?
  • 将编辑帖子并提供一些代码。
  • 如果我将流转储到 XmlDocument 中然后尝试反序列化,我看到反序列化器在抛出错误时处于元素小时。在这种格式中,错误也会出现在 开始的正确行和位置。
  • 你究竟想进入[XmlElement("site")]public string City { get; set; }

标签: c# xml-serialization


【解决方案1】:

当我使用 XSD 工具生成类时,我遇到了同样的错误,但错误显示是从我注释掉的行中抛出的。

所以我退出了 VS,并运行了磁盘清理。再次运行我的代码。收到一条消息“出于安全原因,此 XML 文档中禁止使用 DTD。等等。”所以,我允许将 reader 设置为 DtdProcessing.Parse,然后再次运行代码。

成功了。

【讨论】:

    【解决方案2】:

    看这部分:

    [XmlElement("site")]
    public string City { get; set; }
    

    &lt;Site&gt; 包含&lt;Hour&gt;,所以它不是一个内容简单或空的元素,我猜?

    编辑:实际上整个事情看起来都很可疑。 数据对象似乎忽略了 xml 中的所有层次结构信息。

    这样的事情怎么样?

    [Serializable, XmlRoot("model_data")]
    public class WeatherData
    {
        [XmlElement("site")]
        public City[] City { get; set; }
    }
    
    public class City
    {
        [XmlAttribute]
        public string a { get; set; }
    
        [XmlAttribute]
        public string b { get; set; }
    
        [XmlElement(ElementName="hour", IsNullable=true)]
        public Hour Hour { get; set; }
    }
    
    public class Hour 
    {    
        [XmlAttribute]
        public string x { get; set; }
    
        [XmlAttribute]
        public string y { get; set; }
    
        [XmlAttribute]
        public string z { get; set; }   
    }
    

    【讨论】:

    • 我更改了我的对象类以完全匹配 xml 元素名称,但仍然收到相同的错误。
    • @TheGeekYouNeed:让我担心的不是名称差异;您正在尝试将带有子元素的元素放入字符串中,该字符串应该包含什么?
    • 我从 xml 创建了一个 XSD,然后从该 XSD 生成了类,但仍然收到相同的错误。
    • @TheGeekYouNeed:即使在没有未转义的“>6”的数据中?这很奇怪。生成的类是什么样的?你也可以尝试从你的 dtd 生成一个 xsd:stackoverflow.com/questions/1510126/…
    • 是的,即使在没有 >6 的数据中也是如此。我将使用生成的类更新帖子。
    猜你喜欢
    • 1970-01-01
    • 2017-11-07
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多