如何将嵌套数组从xml反序列化为c#对象?

问题描述 投票:0回答:1

我正在尝试将以下soap xml响应从我的Web服务反序列化为C#对象:

    <?xml version="1.0" encoding="utf-16"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Body>
    <ns2:ExportPositionsQueryResponse xmlns:ns2="http://ns" xmlns:ns3="http://nscpm/datatypes/schema/v2011_06_01" xmlns="http://nscpmexportvalue/schema/v2011_06_01">
      <ns2:Positions>
        <FieldTypes>
          <FieldType ExtId="PF_NAME" Type="string"></FieldType>
          <FieldType ExtId="POSITION_QUANTITY" Type="double"></FieldType>
          <FieldType ExtId="INST_NAME" Type="string"></FieldType>
          <FieldType ExtId="INST_TYPE" Type="string"></FieldType>
          <FieldType ExtId="POSITION_TYPE" Type="string"></FieldType>
          <FieldType ExtId="POSITION_CLASS" Type="string"></FieldType>
        </FieldTypes>
        <Position>
          <Field ExtId="INST_NAME" Value="name"></Field>
          <Field ExtId="INST_TYPE" Value="asd"></Field>
          <Field ExtId="PF_NAME" Value="ads"></Field>
          <Field ExtId="POSITION_CLASS" Value="asd"></Field>
          <Field ExtId="POSITION_TYPE" Value="asd"></Field>
          <Field ExtId="POSITION_QUANTITY" Value="asd"></Field>
        </Position>
        <Position>
          <Field ExtId="INST_NAME" Value="asd"></Field>
          <Field ExtId="INST_TYPE" Value="asd"></Field>
          <Field ExtId="PF_NAME" Value="asd"></Field>
          <Field ExtId="POSITION_CLASS" Value="ads"></Field>
          <Field ExtId="POSITION_TYPE" Value="NORMAL"></Field>
          <Field ExtId="POSITION_QUANTITY" Value="asd"></Field>
        </Position>
        <Position>
</ns2:Positions>
    </ns2:ExportPositionsQueryResponse>
  </soap:Body>
</soap:Envelope>

反序列化之后,xmlSerializer仅使用元素FieldTypes和最后一个元素Position创建对象。我认为XmlSerializer嵌套Array(PositionField[][] Position)有问题,无法对所有Position数组元素进行反序列化。这是我用于反序列化的C#对象类的一部分:

    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://ns")]
    public partial class ExportPositionsQueryResponsePositions
    {
        private FieldTypesFieldType[] fieldTypesField;

        private PositionField[][] positionField;

        [System.Xml.Serialization.XmlArrayAttribute(Namespace = "http://ns")]
        [System.Xml.Serialization.XmlArrayItemAttribute("FieldType", IsNullable = false)]
        public FieldTypesFieldType[] FieldTypes
        {
            get
            {
                return this.fieldTypesField;
            }
            set
            {
                this.fieldTypesField = value;
            }
        }
        [System.Xml.Serialization.XmlArray(ElementName ="Position",Namespace = "http://ns")]
        [System.Xml.Serialization.XmlArrayItem("Field", typeof(PositionField[]), IsNullable = false)]
        public PositionField[][] Position
        {
            get
            {
                return this.positionField;
            }
            set
            {
                this.positionField = value;
            }
        }
    }

为了创建此类,我使用了Visual Studio的“特殊粘贴”功能。但是,使用svcutil工具也会遇到同样的问题。

c# multidimensional-array soap xmlserializer
1个回答
0
投票

我已经解决了问题。我应该编辑自动生成的代理客户端类。我已经用List <>

© www.soinside.com 2019 - 2024. All rights reserved.