微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SOAP 响应 .NET 中的部分反序列化 XmlArray

如何解决SOAP 响应 .NET 中的部分反序列化 XmlArray

我在反序列化 SOAP 响应时遇到问题。我得到 xml 像: https://pastebin.com/pNFmJUzB 它来自 Web 服务的 xml

但是 RegistryObjectList 中的元素没有被反序列化(statusField 被正确反序列化):

enter image description here

代码由 webService provider 共享的 wsdl 生成。我使用 svcutil 到达它。这是我的代码

我运行这个函数

    Public Function DocumentRegistry_RegistryStoredQuery(ByVal AdhocQueryRequest As AdhocQueryRequest) As AdhocQueryResponse
        Dim inValue As DocumentRegistry_RegistryStoredQueryRequest = New DocumentRegistry_RegistryStoredQueryRequest()
        inValue.AdhocQueryRequest = AdhocQueryRequest
        Dim retVal As DocumentRegistry_RegistryStoredQueryResponse = CType(Me,ObslugaEdmIti18WSPortType).DocumentRegistry_RegistryStoredQuery(inValue)
        Return retVal.AdhocQueryResponse
    End Function

返回 AdHocQueryResponse :

'''<remarks/>
<System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil","4.8.3928.0"),_
System.SerializableAttribute(),_
System.Diagnostics.DebuggerStepThroughAttribute(),_
System.ComponentModel.DesignerCategoryAttribute("code"),_
System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=true,[Namespace]:="urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0")>  _
Partial Public Class AdhocQueryResponse
   Inherits RegistryResponseType
   
   Private registryObjectListField() As IdentifiableType
   
   Private startIndexField As String
   
   Private totalResultCountField As String
   
   Public Sub New()
       MyBase.New
       Me.startIndexField = "0"
   End Sub
   
   '''<remarks/>
   <System.Xml.Serialization.XmlArrayAttribute(Order:=0),_
    System.Xml.Serialization.XmlArrayItemAttribute("Identifiable",IsNullable:=False)> _
   Public Property RegistryObjectList() As IdentifiableType()
       Get
           Return Me.registryObjectListField
       End Get
       Set(value As IdentifiableType())
           Me.registryObjectListField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlAttributeAttribute(DataType:="integer"),_
    System.ComponentModel.DefaultValueAttribute("0")>  _
   Public Property startIndex() As String
       Get
           Return Me.startIndexField
       End Get
       Set
           Me.startIndexField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlAttributeAttribute(DataType:="integer")>  _
   Public Property totalResultCount() As String
       Get
           Return Me.totalResultCountField
       End Get
       Set
           Me.totalResultCountField = value
       End Set
   End Property
End Class

AdHocQueryResponse 应该包含 ExtrinsicObjects :


'''<remarks/>
<System.Xml.Serialization.XmlIncludeAttribute(GetType(RegistryObjectType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(NotificationType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(AdhocQueryType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(SubscriptionType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(FederationType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(RegistryType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(PersonType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(UserType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(SpecificationLinkType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ServiceBindingType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ServiceType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(RegistryPackageType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(OrganizationType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ExtrinsicObjectType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ExternalLinkType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ClassificationSchemeType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ClassificationNodeType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(AuditableEventType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(AssociationType1)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ExternalIdentifierType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ClassificationType)),_
System.Xml.Serialization.XmlIncludeAttribute(GetType(ObjectRefType)),_
System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil",_
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")>  _
Partial Public Class IdentifiableType
   
   Private slotField() As Slottype1
   
   Private idField As String
   
   Private homeField As String
   
   '''<remarks/>
   <System.Xml.Serialization.XmlElementAttribute("Slot",Order:=0)>  _
   Public Property Slot() As Slottype1()
       Get
           Return Me.slotField
       End Get
       Set
           Me.slotField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlAttributeAttribute(DataType:="anyURI")>  _
   Public Property id() As String
       Get
           Return Me.idField
       End Get
       Set
           Me.idField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlAttributeAttribute(DataType:="anyURI")>  _
   Public Property home() As String
       Get
           Return Me.homeField
       End Get
       Set
           Me.homeField = value
       End Set
   End Property
End Class

'''<remarks/>
<System.Xml.Serialization.XmlIncludeAttribute(GetType(NotificationType)),_
System.Xml.Serialization.XmlTypeAttribute([Namespace]:="urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")>  _
Partial Public Class RegistryObjectType
   Inherits IdentifiableType
   
   Private nameField As InternationalStringType
   
   Private descriptionField As InternationalStringType
   
   Private versionInfoField As VersionInfoType
   
   Private classificationField() As ClassificationType
   
   Private externalIdentifierField() As ExternalIdentifierType
   
   Private lidField As String
   
   Private objectTypeField As String
   
   Private statusField As String
   
   '''<remarks/>
   <System.Xml.Serialization.XmlElementAttribute(Order:=0)>  _
   Public Property Name() As InternationalStringType
       Get
           Return Me.nameField
       End Get
       Set
           Me.nameField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlElementAttribute(Order:=1)>  _
   Public Property Description() As InternationalStringType
       Get
           Return Me.descriptionField
       End Get
       Set
           Me.descriptionField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlElementAttribute(Order:=2)>  _
   Public Property VersionInfo() As VersionInfoType
       Get
           Return Me.versionInfoField
       End Get
       Set
           Me.versionInfoField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlElementAttribute("Classification",Order:=3)>  _
   Public Property Classification() As ClassificationType()
       Get
           Return Me.classificationField
       End Get
       Set
           Me.classificationField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlElementAttribute("ExternalIdentifier",Order:=4)>  _
   Public Property ExternalIdentifier() As ExternalIdentifierType()
       Get
           Return Me.externalIdentifierField
       End Get
       Set
           Me.externalIdentifierField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlAttributeAttribute(DataType:="anyURI")>  _
   Public Property lid() As String
       Get
           Return Me.lidField
       End Get
       Set
           Me.lidField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlAttributeAttribute(DataType:="anyURI")>  _
   Public Property objectType() As String
       Get
           Return Me.objectTypeField
       End Get
       Set
           Me.objectTypeField = value
       End Set
   End Property
   
   '''<remarks/>
   <System.Xml.Serialization.XmlAttributeAttribute(DataType:="anyURI")>  _
   Public Property status() As String
       Get
           Return Me.statusField
       End Get
       Set
           Me.statusField = value
       End Set
   End Property
End Class

我希望我分享解决我的问题所需的所有代码

解决方法

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            string xml = File.ReadAllText(FILENAME);
            StringReader sReader = new StringReader(xml);
            XmlReader xReader = XmlReader.Create(sReader);

            XmlSerializer serializer = new XmlSerializer(typeof(Envelope));
            Envelope envelope = (Envelope)serializer.Deserialize(xReader);
        }
    }
    [XmlRoot(Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
    public class Envelope
    {
        [XmlElement(Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        public Body Body { get; set; }
    }
    public class Body
    {
        [XmlElement(Namespace = "urn:oasis:names:tc:ebxml-regrep:xsd:query:3.0")]
        public AdhocQueryResponse AdhocQueryResponse { get; set; } 
    }
    public class AdhocQueryResponse
    {
        [XmlArray(ElementName = "RegistryObjectList",Namespace = "urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")]
        [XmlArrayItem(ElementName = "ExtrinsicObject",Namespace = "urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")]
        public ExtrinsicObject[] ExtrinsicObject { get; set; }
    }
    public class ExtrinsicObject
    {
        [XmlElement(Namespace = "urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")]
        public Slot[] Slot { get; set; }
    }
    public class Slot
    {
        [XmlAttribute()]
        public string name { get; set; }

        [XmlArray(ElementName = "ValueList",Namespace = "urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")]
        [XmlArrayItem(ElementName = "Value",Namespace = "urn:oasis:names:tc:ebxml-regrep:xsd:rim:3.0")]
        public string[] Value { get; set; }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。