我有一个.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属性,那么一切都很好。
如何让这些元素成为可选元素,但是在为它们赋值时序列化?
提前感谢您的帮助。
答案 0 :(得分:3)
对于在模式中标记为可选的非可空类型(在.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”。虽然没试过。