3

我有一个小问题,有点令人沮丧。在 C# (.NET 3.5) 中反序列化 xml 时是否可以设置默认值?基本上我试图反序列化一些不受我控制的xml,一个元素看起来像这样:

<assignee-id type="integer">38628</assignee-id>

它也可以是这样的:

<assignee-id type="integer" nil="true"></assignee-id>

现在,在我的课堂上,我有以下应该接收数据的属性:

[XmlElementAttribute("assignee-id")]
public int AssigneeId { get; set; }

这适用于第一个 xml 元素示例,但第二个失败。我尝试将属性类型更改为 int?但这无济于事。我也需要在某个时候将其序列化回相同的 xml 格式,但我正在尝试使用内置的序列化支持,而不必求助于自己的序列化支持。

有没有人有这种问题的经验?

4

3 回答 3

3

看起来您的源 XML 正在使用 xsi:type 和 xsi:nil,但没有在它们前面加上命名空间。

你可以做的是用 XSLT 处理这些来改变它:

<assignees>
  <assignee>
    <assignee-id type="integer">123456</assignee-id>
  </assignee>
  <assignee>
    <assignee-id type="integer" nil="true"></assignee-id>
  </assignee>
</assignees>

进入这个:

<assignees xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <assignee>
    <assignee-id xsi:type="integer">123456</assignee-id>
  </assignee>
  <assignee>
    <assignee-id xsi:type="integer" xsi:nil="true" />
  </assignee>
</assignees>

这将由 XmlSerializer 正确处理,而无需任何自定义代码。用于此的 XSLT 相当简单,而且是一个有趣的练习。从众多“复制”XSLT 示例之一开始,然后简单地为“type”和“nil”属性添加一个模板以输出命名空间属性。

如果您愿意,您可以将 XML 文档加载到内存中并更改属性,但这不是一个好主意,因为 XSLT 引擎已针对性能进行了调整,并且可以处理相当大的文件而无需将它们完全加载到内存中。

于 2008-10-11T08:57:53.203 回答
2

您可能想查看OnDeserializedAttributeOnSerializingAttributeOnSerializedAttributeOnDeserializingAttribute以将自定义逻辑添加到序列化过程

于 2008-10-10T22:13:21.367 回答
1

XmlSerializer 使用 xsi:nil - 所以我希望您需要为此进行自定义 IXmlSerializable 序列化。对不起。

于 2008-10-10T22:07:23.563 回答