【问题标题】:Get name of XmlElementAttribute after deserialization反序列化后获取 XmlElementAttribute 的名称
【发布时间】:2011-10-25 14:41:52
【问题描述】:

我没有找到这方面的任何信息,也许有人可以帮忙。

我有一个 XML(为方便起见进行了简化):

<content>
  <field1>value</field1>
  <field2>
    <field3>value</field3>
  </field2>
</content>

我尝试使用这样的类对其进行反序列化:

[XmlRoot("content")]
public class Content
{
    [XmlElement]
    public List<Item> Fields { get; set; }
}

public class Item
{

    [XmlElement]
    public List<Item> Fields { get; set; }

    [XmlText]
    public String Value { get; set; }
}

我有两个问题:

  1. 我可以获得该字段的实际名称吗?像 Item 类中的 [XmlName] string name; 一样?还是类本身的某种属性?由于某些原因,无法将节点名称设置为“field”并添加“type”属性;-) 虽然实际的类和序列化过程非常复杂,但我不想实现自己的序列化器。

  2. 我可以添加通配符,如 [XmlElement("field*")]?在我知道第一个问题的答案之前,我无法对其进行测试,所以如果有更好的选择,我也很想知道。

谢谢。

【问题讨论】:

  • 看起来您正在尝试创建一个可以表示任意 XML 的结构。如果是这样,你为什么要使用 XML 序列化呢?使用 LINQ to XML 可能更合适。
  • 嗯,你是对的,这是一个相当随意的结构。关键是,我已经在很多情况下使用了 XML 序列化,我想在我的整个项目中保留这个约定(直到现在……)。当然,如果我找不到解决方案,我会切换到 LINQ..

标签: c# xml-serialization


【解决方案1】:

可以在Attribute的构造函数中设置匹配的XMl-Element或Attribute的名称

[XmlAttribute("FieldAsAttribute")]

--> 将属性序列化/反序列化为 Xml 属性 FieldAsAttribute

[XmlElement("FieldAsElement")]

--> 将属性序列化/反序列化为 Xml 元素 FieldAsElement

【讨论】:

  • 它只会序列化/反序列化具有此类名称的元素。正如上面提到的@svick,我需要反序列化任意 XML 结构。
【解决方案2】:

这里唯一的答案是,很遗憾,这是不可能的。

因此,我们编写了自己的序列化例程。

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多