【问题标题】:Parsing xml element to class将xml元素解析为类
【发布时间】:2011-11-23 12:55:56
【问题描述】:

我有来自 web 请求的 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 元素“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 元素而不反序列化整个 xml 文档时犯了错误?

【问题讨论】:

    标签: c# xml xml-deserialization


    【解决方案1】:

    您必须为 XML 文件的整个语法指定一个 Serializable 才能使反序列化工作!所以从 XML 中的根节点向下到这个节点。 (我不能给你一个例子,因为你的查找网址不适合我;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...
    }
    

    【讨论】:

    • 我已经更新了 xml-response 的链接。但我的目标不是反序列化整个 xml 文档,因为我真的不需要它的大部分。我只需要整个文档中的 3 行。所以我认为我可能只反序列化我需要的 xml 节点。是否有任何其他选项可以从具有属性的单个 xml-elment 创建对象?
    • 看来我可以通过这种方式获取属性值。实际上它不是反序列化,但我想在我的情况下没有必要使用它。感谢您的帮助!
    【解决方案2】:

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

    【讨论】:

    • 是的,这肯定很容易,因为我知道怎么做 :) 但我很好奇是否有任何方法可以从具有属性的单个 xml 元素创建对象。我想避免整个 xml 文档的反序列化。
    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多