2011-11-23 125 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文檔的反序列化。 –