我遇到了一个有点令人沮丧的小问题。在 C# (.NET 3.5) 中反序列化 xml 时是否可以设置默认值?基本上我正在尝试反序列化一些不受我控制的 xml,一个元素如下所示:
<assignee-id type="integer">38628</assignee-id>
它也可以是这样的:
<assignee-id type="integer" nil="true"></assignee-id>
现在,在我的类(class)中,我有以下应该接收数据的属性:
[XmlElementAttribute("assignee-id")]
public int AssigneeId { get; set; }
这对于第一个 xml 元素示例工作正常,但第二个失败。我试过将属性类型更改为 int?但这没有帮助。我也需要在某个时候将它序列化回相同的 xml 格式,但我正在尝试使用内置的序列化支持,而不必自己动手。
有没有人遇到过这种问题?
最佳答案
看起来您的源 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 引擎针对性能进行了调整,并且可以处理相当大的文件而无需将它们完全加载到内存中。
关于c# - 在 C# (.NET 3.5) 中反序列化 xml 时是否可以设置默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/193185/