我有一些带有这样的元素的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 **
答案 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,然后再次运行代码。
成功了。