gpt4 book ai didi

xsd - SvcUtil 为 xsd :all complexcontent 生成 "Order"命名参数

转载 作者:行者123 更新时间:2023-12-04 16:56:58 25 4
gpt4 key购买 nike

这是我的困境,svcutil 命令仍然为标记为 xsd:all 的复杂内容生成 Order Named 参数。

这是我的示例架构。

<xsd:complexType name="SpecialReportEntityRow" >
<xsd:complexContent>
<xsd:extension base="list:BaseRowExt">
<xsd:all>
<xsd:element name="customerName" type="xsd:string" form="unqualified" minOccurs="0" maxOccurs="1" />
<xsd:element name="Id" type="xsd:long" form="unqualified" minOccurs="0" maxOccurs="1" />
<xsd:element name="certificateType" type="xsd:string" form="unqualified" minOccurs="0" maxOccurs="1" />
<xsd:element name="certificateValidity" type="xsd:long" form="unqualified" minOccurs="0" maxOccurs="1" />
<xsd:element name="item" type="xsd:long" form="unqualified" minOccurs="0" maxOccurs="1" />
<xsd:element name="description" type="xsd:string" form="unqualified" minOccurs="0" maxOccurs="1" />
<xsd:element name="quantity" type="xsd:long" form="unqualified" minOccurs="0" maxOccurs="1" />
<xsd:element name="startDate" type="xsd:dateTime" form="unqualified" minOccurs="0" maxOccurs="1" />
<xsd:element name="endDate" type="xsd:dateTime" form="unqualified" minOccurs="0" maxOccurs="1" />
</xsd:all>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

对于上面的模式,这里是代码片段生成的代理。请看它在属性中生成订单命名参数。尽管架构包含 xsd:all 内容。

主要问题是服务发送数据的顺序是字母顺序或任何随机顺序,因此模式具有 xsd:all 而不是 xsd:sequence。现在在运行时,如果我们有订单命名参数,对象 SpecialReportEntityRow 被初始化为默认值而不是服务数据。例如。 CertificateType 属性初始化为空字符串,CertificateValidaty 初始化为 0,所有属性都初始化为其默认值。运行时不会抛出反序列化错误。

如果我通过删除 XmlElementAttribute Order 命名参数来修改代理类,那么在运行时对象 SpecialReportEntityRow 将获得正确的服务数据。

谁能指导我如何解决这个问题,我不想修改代理类,为什么 svcutil 不考虑 xsd:all。

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
public string customerName
{
get
{
return this.customerNameField;
}
set
{
this.customerNameField = value;
}
}

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
public long orgId
{
get
{
return this.orgIdField;
}
set
{
this.orgIdField = value;
}
}

示例响应 XML:

<ns5:rows xsi:type="ns7:SpecialReportEntityRow">
<certificateType>Dummy Type 1</certificateType>
<certificateValidity>2</certificateValidity>
<customerName>Customer1</customerName>
<description>Revocations by Reason - Unused</description>
<item>17</item>
</ns5:rows>
<ns5:rows xsi:type="ns7:SpecialReportEntityRow">
<certificateType>Dummy Type 2</certificateType>
<certificateValidity>2</certificateValidity>
<customerName>Custome1</customerName>
<description>Revocations by Reason- Ca Compromise</description>
<item>19</item>
</ns5:rows>

最佳答案

据我所知,无法使用 svcutil 抑制“Order”属性,因此我们编写了一个 Powershell 脚本来将其删除。它很脏,但它可以工作,我们不必担心在重新生成时手动将其剥离。

我们使用 powershell 脚本生成去除“订单”属性的代理类:

svcutil /serializer:XmlSerializer '..\.\Schema\MyService.wsdl' '/n:*,MyService.GeneratedCode'  '/o:MyServiceProxy.cs'  '/nologo' 


(Get-Content .\o:MyServiceProxy.cs) |
Foreach-Object {
$_ -replace ", ReplyAction=`"\*`"", "" `
-replace ", Order=.", "" `
-replace "Order=.", ""
} |
Set-Content .\o:MyServiceProxy.cs

关于xsd - SvcUtil 为 xsd :all complexcontent 生成 "Order"命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384254/

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