将xml元素解析为类

时间:2011-11-23 12:55:56

标签: c# xml xml-deserialization

我有来自网络请求的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文档时犯了错误?

2 个答案:

答案 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对象的属性。