簡體   English   中英

如何反序列化從 xml 到 c# object 的嵌套數組?

[英]How to deserialize a nested Array from xml to c# object?

I'm trying deserialize the following soap xml response from my web service to a C# object:

    <?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 的最后一個元素Position 我認為XmlSerializer嵌套Array(PositionField[][] Position)存在問題,無法反序列化所有Position數組元素。 這是我用於反序列化的C# object class 的一部分:

    [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;
            }
        }
    }

為了創建這個 class,我使用了 Visual Studio 的“Paste special”function。 但是使用svcutil工具我也遇到了同樣的問題。

我已經解決了這個問題。 我應該編輯自動生成的代理客戶端 class。 我已經用List<T>替換了所有nested arrays [][]並且序列化再次起作用。 這是示例:

錯誤生成的部分代碼:

private PositionField[][] positionField;

public PositionField[][] Position
    {
        get
        {
            return this.positionField;
        }
        set
        {
            this.positionField = value;
        }
    }

編輯部分代碼:

 private List<PositionField> positionField;

 public List<PositionField> Position
    {
        get
        {
            return this.positionField;
        }
        set
        {
            this.positionField = value;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM