反序列化空但具有属性的 xml 元素

本文关键字:xml 元素 属性 反序列化 | 更新日期: 2023-09-27 18:32:39

我有一些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 **

反序列化空但具有属性的 xml 元素

看这部分:

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

<Site>包含<Hour>,所以它不是一个内容简单或空洞的元素,我猜?

编辑:实际上整个事情似乎很可疑。数据对象似乎忽略了 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; }   
}

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

所以我退出了VS,并运行了磁盘清理。 再次运行我的代码。 收到消息"出于安全原因,此 XML 文档中禁止 DTD。等等。 因此,我允许将读取器设置为DtdProcessing.Parse,并再次运行代码。

它很成功。