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

时间:2012-04-28 18:56:12

标签: c# xml-serialization

我有一些带有这样的元素的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所以我无法改变它。我该如何反序化呢?

**编辑**

其中一个属性'值是“&gt; 6”....这可能是罪魁祸首吗?如果是这样,我该如何处理?

**更新**

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

**编辑#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 **

2 个答案:

答案 0 :(得分:0)

看这部分:

[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; }   
}

答案 1 :(得分:0)

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

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

成功了。