XmlSerializer - 必需的元素

Posted

技术标签:

【中文标题】XmlSerializer - 必需的元素【英文标题】:XmlSerializer - required elements 【发布时间】:2012-02-23 08:21:15 【问题描述】:

我将 XmlSerializer 用于 WCF 服务(就我的服务而言,这是有原因的)。但是最近我遇到了一个问题:我找不到一种简单的方法来使引用类型属性成为必需,即使其在 XSD 中的定义如下所示:

<xs:element minOccurs="1" maxOccurs="1" name="Name" type="xs:string"/>

而不是这个:

<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string"/>

这里是属性代码:

[XmlElement]
public string Name  get; set; 

我知道使用 DataContractSerializer 我可以做到这一点:

[DataMember(IsRequired = true)]
public string Name  get; set; 

我会得到想要的架构。

任何想法如何通过 XmlSerializer 属性获得类似于 IsRequired 的功能?

谢谢。

【问题讨论】:

【参考方案1】:

使用

[XmlElement(IsNullable=true)]

即使为 null,也应强制对成员进行序列化,使其 minOccurs 为 1(我认为 - 尚未检查)。

【讨论】:

你说得对,它确实在 xsd 中将 minOccurs 设置为 1,但它还为 xs:element 添加了 nillable="true" 属性。我想要的是保证没有这个元素的客户端消息不会被服务接受,所以我不必检查相应的属性是否为空。 我不认为您可以获得默认的 xml 序列化程序来强制元素,而不需要额外的属性。是否可以选择实现 IXmlSerializable 以便您可以完全自定义生成的 xml?【参考方案2】:

要走的路是手动创建或编辑 XSD,然后使用验证 XmlReader 作为 XmlSerializer 的输入。

【讨论】:

以上是关于XmlSerializer - 必需的元素的主要内容,如果未能解决你的问题,请参考以下文章

C#中通过XmlSerializer类反序列化多个同名XML元素

如何使用 XmlSerializer 类对象将具有相同名称的 2 个子元素组合成单个属性是 C#

具有相同元素名称但属性值不同的XML的XSD架构[关闭]

C# Xmlserializer 将列表反序列化为 0 而不是 null

C# XMLSerializer 将错误的类型反序列化为 List

spring 配置文件的头部 xmls