针对minoccurs的XML序列化问题

时间:2008-11-18 14:14:35

标签: xml xml-serialization

我有一个.NET Web应用程序,它使用基于Java的Web服务。其中一个名为Optional的对象包含搜索条件字段。架构如下:

<xsd:complexType name="Optional">
 <xsd:sequence>
  <xsd:element name="FromAmount" nillable="true" type="xsd:float" minOccurs="0" /> 
  <xsd:element name="ToAmount" nillable="true" type="xsd:float" minOccurs="0" /> 
  <xsd:element name="FromDate" nillable="true" type="xsd:dateTime" minOccurs="0" /> 
  <xsd:element name="ToDate" nillable="true" type="xsd:dateTime" minOccurs="0" /> 
  <xsd:element name="FromCheckNumber" nillable="true" type="xsd:long" minOccurs="0" /> 
  <xsd:element name="ToCheckNumber" nillable="true" type="xsd:long" minOccurs="0" /> 
 </xsd:sequence>
</xsd:complexType>

我遇到的问题是,即使在Web应用程序中为它们分配了值,子元素也不会序列化。如果我删除minOccurs属性,那么一切都很好。

如何让这些元素成为可选元素,但是在为它们赋值时序列化?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

.NET中的

对于在模式中标记为可选的非可空类型(在.NET中),为它们生成了一个额外的指定属性,用于控制元素是否出现。非常烦人的是,值的setter没有设置额外的指定标志,所以你需要这样做。

x.ToAmmount = 24.0f;
x.ToAmmountSpecified = true;
// etc for the rest of the poperties

答案 1 :(得分:0)

此架构未定义任何xml文档类型。它只是为名为“Optional”的compex类型提供声明,但是从任何地方都没有引用此类型。

定义的xml文档必须至少包含一个top元素。这个顶级元素需要在某个地方定义(在全局范围内)。提供的架构中没有这样的定义。

xml架构的最小示例,与提供的类似,但确实定义了xml文档如下:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema 
    elementFormDefault="qualified"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
  <xsd:element name="Optional" type="Optional"/>
  <xsd:complexType name="Optional">
    <xsd:sequence>
      <xsd:element name="FromAmount" nillable="true" type="xsd:float" minOccurs="0" />
      <xsd:element name="ToAmount" nillable="true" type="xsd:float" minOccurs="0" />
      <xsd:element name="FromDate" nillable="true" type="xsd:dateTime" minOccurs="0" />
      <xsd:element name="ToDate" nillable="true" type="xsd:dateTime" minOccurs="0" />
      <xsd:element name="FromCheckNumber" nillable="true" type="xsd:long" minOccurs="0" />
      <xsd:element name="ToCheckNumber" nillable="true" type="xsd:long" minOccurs="0" />
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

并且可以根据此模式成功验证的最简单的xml文档只是

<Optional/>

(因为top元素的所有子元素都被定义为可选)。

希望这会有所帮助。

干杯,

Dimitre Novatchev

答案 2 :(得分:0)

我的理解是,如果值不存在,nillable =“true”会在值XML中生成xsi:nil =“true”,这意味着即使值为null,也始终会创建元素。

尝试删除nillable属性并保持minOccurs =“0”。虽然没试过。