1

我有一个使用基于 Java 的 Web 服务的 .NET 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 属性,那么一切都很好。

如何使这些元素成为可选元素,但在为其分配值时进行序列化?

在此先感谢您的帮助。

4

3 回答 3

3

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

x.ToAmmount = 24.0f;
x.ToAmmountSpecified = true;
// etc for the rest of the poperties
于 2008-11-27T19:26:13.880 回答
0

此模式未定义任何 xml 文档类型。它只是为名为“可选”的复合类型提供了一个声明,但没有从任何地方引用此类型。

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

xml 模式的一个最小示例,类似于提供的模式,但确实定义了一个 xml 文档,如下所示:

<?xml 版本="1.0" 编码="utf-8"?>
<xsd:模式
    elementFormDefault="合格"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>
  <xsd:element name="可选" type="可选"/>
  <xsd:complexType name="可选">
    <xsd:序列>
      <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/>

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

希望这有帮助。

干杯,

迪米特·诺瓦切夫

于 2008-11-19T04:31:51.643 回答
0

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

尝试删除 nillable 属性并保留 minOccurs="0"。虽然没试过。

于 2008-11-28T14:03:51.317 回答