c# - 在 C# (.NET 3.5) 中反序列化 xml 时是否可以设置默认值?

标签 c# xml serialization

我遇到了一个有点令人沮丧的小问题。在 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/

相关文章:

c# 打开 cmd.exe 进程并执行多个命令

java - 如何在android 2.3中设置菜单背景

xml - 使用 xsltproc 输出 XHMTL

java - 如何读取 Java 中序列化对象的大小(以字节为单位)?

Javascript将表单序列化为对象

c# - TCP 套接字服务器 Windows 应用程序

c# - 同步访问多个线程可以访问的对象

c# - 使用 Azure WebJobs/Azure Functions 在服务队列上安排消息?

用于 XML 流程的 Java JAXP 或 Xerces2?

c# - 如何使标志枚举在 C# 中以数字方式序列化其组合值?