gpt4 book ai didi

.net - 如何使 dotnet web 服务在字符串值上设置 minOccurs ="1"

转载 作者:行者123 更新时间:2023-12-02 18:09:14 25 4
gpt4 key购买 nike

我有一个 XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://a.com/a.xsd"
targetNamespace="http://a.com/a.xsd"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:element name="A">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" minOccurs="1" maxOccurs="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

我已使用 XSD.exe v2.0.50727.3615 将其转换为 C# 类,生成的代码如下

namespace A {
using System.Xml.Serialization;
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://a.com/a.xsd")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://a.com/a.xsd", IsNullable=false)]
public partial class A {
private string itemField;
/// <remarks/>
public string Item {
get {
return this.itemField;
}
set {
this.itemField = value;
}
}
}
}

我在我的网络服务中返回一个 A.A 对象,它会在服务描述中生成此代码段

<s:schema elementFormDefault="qualified" targetNamespace="http://a.com/a.xsd"> 
<s:element name="Test2Result">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Item" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
</s:schema>

从 XSD 中的 minOccrus="1"更改为自动生成的 WSDL 中的 minOccurs="0"给系统另一端的计算机带来了麻烦。

我当然可以提供一份手工编辑的 WSDL 供他们使用,但我希望自动生成的 WSDL 能够满足他们的需求。

关于如何说服 dotnet 在其自动生成的 WSDL 中为字符串类型输出 minOccurs="1"而不添加 nillable="true"有什么建议吗?

最佳答案

引用文献

根据 MSDN MinOccurs Attribute Binding Support ,只有 2 种方法可以获得 MinOccurs = 1

  1. 没有默认值或附带 bool 字段的值类型。

    Result: minOccurs value of output element is set to 1

  2. XmlElement 特性的 IsNullable 属性设置为 true 的引用类型。

    Result: minOccurs value of output element is set to 1. In the element, the nillable attribute is also set to true.

字符串类型的属性(不幸的是)始终具有默认值

string.Empty

所以它永远不能有null默认值。这意味着我们永远无法满足第一个解决方案。为字符串生成 MinOccurs=1 的唯一方法是使元素可空:

C#

[XmlElementAttribute(IsNullable = true)]
public string Item { ... }

VB

<XmlElement(IsNullable:=True)>
Public Item As String

解决方案

唯一真正的解决方案是手动编辑 XSD...boo xsd.exe。

更多坏消息

即使有可能,Nick DeVore 也链接到 John Sounder's response在另一个线程中,该线程声明该字段不用于传入的 XML。因此用户仍然有可能发送无效的 XML。

关于.net - 如何使 dotnet web 服务在字符串值上设置 minOccurs ="1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3961112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com