【问题标题】:Deserialize XML to object and ignore some nodes将 XML 反序列化为对象并忽略某些节点
【发布时间】:2017-01-16 13:27:56
【问题描述】:

我有带节点的 XML 字符串:

MyXmlString="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><MyNodes><Node1 /><Node2 /><Node3 /></MyNodes>";

我有课:

public class MyClass
{
    [DataMember]
    [XmlElement("Node1", Order = 10)]
    public String Node1 { get; set; }

    [DataMember]
    [XmlElement("Node3", Order = 20)]
    public String Node3 { get; set; }
}

当我从 XML 反序列化为对象时,我想跳过字符串中的 Node2:

MyClass MyObject= XElement.Parse(MyXmlString).FromXml<MyClass>();

MyObject 具有 Node1 的值,但 Node3 为空,即使 xmlString 具有它的值。 在将某些对象序列化为 Xml 时,我可以使用 xmlIgnore。但我的情况正好相反——xml 有我不需要的节点。最简单的方法是什么?

【问题讨论】:

  • 如果那是你的 xml 它不是有效的 xml
  • 我只是为示例编写了一些虚构的 xml。我已更正它以使其更加清晰。感谢您的通知。

标签: c# xml xml-serialization


【解决方案1】:

如果您删除 Order 属性,您将获得 Node3 的值,XmlSerializer 将忽略 Node2。如果您真的不需要订购,则不应使用它。

在这里寻找非常相似的案例:XmlSerializer. Skip xml unknown node

【讨论】:

  • 我无法移动订单属性。如何将 node2 添加到我的类定义中,因为我不知道它的类型(它是具有未知类型的子元素的数组),只需用作对象类型。类似:[DataMember] [XmlIgnore("Node2", Order = 20)] public Object[] Node2 { get;放; }
  • 我认为,您可以将其添加为 [XmlElement("Node2", Order = 15)] public object Node2 { get;放; } 用你的简单 xml 就可以了。
  • @Simon 为什么不能删除订单属性?这就是阻止它工作的原因。我看不出他们在做任何对你有帮助的事情。
  • 谢谢。我已将所有缺少的节点添加到类定义中,现在它可以工作了。订单属性可能出于某种原因存在(这不是我的代码)。所以,最好把它留在那里。
猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
相关资源
最近更新 更多