2011-11-23 151 views
1

我有xml文档(你可以从web请求中查找它here)。解析xml元素到类

我需要得到的CCY,base_ccy,购买和销售来自每个 “EXCHANGERATE” 元素的属性值:

<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文档分离所)在汇率类的实例以这种方式:

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属性没有整个XML文档的反序列化时,我犯了错误?

回答

2

您必须为反序列化工作的XML文件的整个语法指定一个Serializable!所以从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... 
} 
+0

我更新了xml-response的链接。但我的目标不是反序列化整个XML文档,因为我并不真正需要它的大部分。整个文档只需要3行。所以我想我可能只反序列化我需要的xml节点。是否有任何其他选项来创建具有属性的单个XML元素的对象? –

+0

看来我可以通过这种方式获取属性值。其实这不是一个反序列化,但我想没有必要在我的情况下使用它。感谢帮助! –

1

您将不得不反序列化整个文档 - 我认为您可能更容易通过xpath找到您需要的交换元素。然后编写一个'手动反序列化器'来读取每个元素的值并填充ExchangeRate对象的属性。

+0

是的,这一定很容易,因为我知道如何去做:)但我很好奇,是否有任何方法来创建具有属性的单个XML元素的对象。我想避免整个xml文档的反序列化。 –