我正在尝试使用第三方网络服务。返回的其中一个字段定义为
<s:element name="SomeField" minOccurs="0" maxOccurs="1" type="s:int"/>
在SOAP响应中,他们将字段发送为
<SomeField/>
这会导致.Net反序列化器抛出异常,因为空的xml元素不是有效的整数。
处理此问题的最佳方法是什么?
我试过调整wsdl来将字段标记为可为空,这会将生成的字段标记为int?但解串器仍然失败。
我可以将端点实现为服务引用或Web服务引用。
答案 0 :(得分:4)
我不认为.Net解串器可以解决这个问题。
如何将SomeField
的定义调整为字符串。这种方式可以检查null,但是您必须将Int32.Parse设置为实际值。
<s:element name="SomeField" minOccurs="0" maxOccurs="1" type="s:string"/>
访问者可能是:
void int? GetSomeField()
{
if (someField == null) return null;
return In32.Parse(someField);
}
答案 1 :(得分:3)
您可以将默认值设置为0.这样,如果未设置该值,则会发送0。
<s:element name="SomeField" minOccurs="0" maxOccurs="1" default="0" type="s:int"/>
答案 2 :(得分:1)
这是他们代码中的错误。这与架构不匹配。 XMLSpy说:
File Untitled6.xml is not valid.
Value '' is not allowed for element <SomeField>.
Hint: A valid value would be '0'.
Error location: root / SomeField
Details
cvc-datatype-valid.1.2.1: For type definition 'xs:int' the string '' does not match a literal in the lexical space of built-in type definition 'xs:int'.
cvc-simple-type.1: For type definition 'xs:int' the string '' is not valid.
cvc-type.3.1.3: The normalized value '' is not valid with respect to the type definition 'xs:int'.
cvc-elt.5.2.1: The element <SomeField> is not valid with respect to the actual type definition 'xs:int'.
我用以下架构得到了它:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="root">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="SomeField" minOccurs="0" maxOccurs="1" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
以及以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<root xsi:noNamespaceSchemaLocation="Untitled5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SomeField/>
</root>