解析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文件的整个语法指定一个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对象的属性。