我有来自网络请求的xml文档(您可以查找here)。
我需要从每个“exchangerate”元素中获取ccy,base_ccy,buy和sale属性的值:
<exchangerate ccy="EUR" base_ccy="UAH" buy="10.81284" sale="10.81284"/>
我手动创建了类ExchangeRate,如下所示:
[Serializable]
public class ExchangeRate
{
[XmlAttribute("ccy")]
public string Ccy
{ get; set; }
[XmlAttribute("base_ccy")]
public string Base_ccy
{ get; set; }
[XmlAttribute("buy")]
public string Buy
{ get; set; }
[XmlAttribute("sale")]
public string Sale
{ get; set; }
}
尝试以这种方式将xml-element“exchangerate”(我从整个xml文档中隔离)反序列化为ExchangeRate类的实例:
private ExchangeRate DesereilizeXMLNode(XmlNode node)
{
XmlSerializer mySerializer = new XmlSerializer(typeof(ExchangeRate));
TextReader reader = new StringReader(node.OuterXml);
return (ExchangeRate)mySerializer.Deserialize(reader);
}
当我调试DesereilizeXMLNode方法时,我在调用反序列化方法时收到异常。在Grid元素第一行的MainWindow.xaml中有一个异常是XAMLParseException(这很奇怪),我认为它不适合调用异常。
问题是:我哪里错了?尝试以这种方式从xml-element创建对象实例时,我错了吗?也许我在尝试使用属性反序列化xml-element而没有反序列化整个xml文档时犯了错误?
答案 0 :(得分:2)
您必须为XML文件的整个语法指定Serializable才能使Deserialize正常工作!所以从XML的根节点到这个节点。 (我不能给你一个例子,因为你的查询网址对我不起作用; 501)
修改强>
那么你必须手动找到元素及其属性,如下例所示。您不能单独反序列化XmlElements,除非您将它们转换为XmlDocument,但这有点过头了。
XmlDocument doc = new XmlDocument();
doc.Load("file.xml");
XmlNodeList nodes = doc.SelectNodes("/account_order/row/exchangerate");
foreach (XmlNode node in nodes)
{
XmlAttribute ccyAttribute = node.Attributes["ccy"];
//etc...
}
答案 1 :(得分:1)
您必须反序列化整个文档 - 我认为您可能更容易找到xpath所需的交换元素。然后编写一个'manual deserialiser',它读取每个元素的值并填充ExchangeRate对象的属性。