反序列化空但具有属性的 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 **
看这部分:
[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,并再次运行代码。
它很成功。