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

C# 反序列化为空但具有属性的xml元素,c#,xml-serialization,C#,Xml Serialization,我有一些XML,其元素如下: <hour base_forecast="12" datim="29/0" /> 我猜这是因为元素没有值。我无法控制此XML,因此无法更改它。我该如何反序列化这个 **编辑** 其中一个属性的值大于6。。。。这可能是罪魁祸首吗?如果是,我该如何处理 **更新** 在属性值中找到一些未返回>的数据。同样的错误也在发生 **编辑3* 为我接收的XML创建一个XSD,然后使用XSD工具为它们生成类。添加到这篇文章的底部 以下是反序列化代码:

我有一些XML,其元素如下:

<hour base_forecast="12" datim="29/0" />
我猜这是因为元素没有值。我无法控制此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>
XSD工具生成的类

**Removed generated classes, but they are similar to what Hugo posted **
看看这部分:

[XmlElement("site")]
public string City { get; set; }
包含,所以它不是一个简单或空内容的元素,我猜

编辑:事实上,整件事似乎很可疑。 数据对象似乎忽略了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,并再次运行代码


成功。

是否可能是您从的父级调用了ReadElementString,或者您的阅读器不在您认为的位置?将编辑帖子并提供一些代码。如果我将流转储到XmlDocument中,然后尝试反序列化,我会看到反序列化器在元素小时抛出错误。在这种格式中,错误被抛出到正确的行和起始位置。您到底想进入[XmlElementsite]公共字符串City{get;set;}中做什么?我更改了对象类以完全匹配xml元素名称,但仍然收到相同的错误。@Geekyouneed:我担心的不是名称差异;您正试图将包含子元素的元素放入字符串中,该字符串应该包含什么?我从xml创建了一个XSD,然后从该XSD生成了类,但仍然收到相同的错误。@TheGeekYouNeed:即使在没有unescaped>6的数据中?真奇怪。生成的类是什么样子的?您还可以尝试从dtd生成xsd:是,即使在没有>6的数据中也是如此。我将用生成的类更新帖子。
[XmlElement("site")]
public string City { get; set; }
[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; }   
}