解析xml元素到类

本文关键字:元素 xml 解析 | 更新日期: 2023-09-27 18:15:34

我有一个来自web请求的xml文档(你可以在这里查找)。

我需要从每个"exchange"元素中获取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元素"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方法时,我在调用反序列化方法时收到异常。异常是主窗口中的XAMLParseException。xaml在Grid元素的第一行(这很奇怪),我认为这不是一个合适的地方调用异常。

问题是:我错在哪里?当我试图以这种方式从xml-element创建对象实例时,我错了吗?也许我在试图只反序列化带有属性的xml元素而不反序列化整个xml文档时犯了错误?

解析xml元素到类

您必须为XML文件的整个语法指定一个Serializable,以使反序列化工作!从XML的根节点到这个节点。(我不能给你一个例子,因为你的查找url不适合我;501)


编辑:

那么你必须手动找到元素和它们的属性,就像下面的例子一样。您不能单独反序列化xmlelement,除非将它们转换为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...
}

您必须对整个文档进行反序列化—我认为使用xpath查找所需的交换元素对您来说可能更容易。然后编写一个"手动反序列化器",读取每个元素的值并填充ExchangeRate对象的属性。

相关文章: