XML-элемент и массив - PullRequest
       0

XML-элемент и массив

2 голосов
/ 14 декабря 2011

Я пытаюсь установить связь с устройством, которое отправляет следующие два сообщения. Во время получения сообщений неизвестно, какую из двух структур сообщений я получил. Используя XSD, я взял .xml и создал файлы .xsd и C # для каждого отдельно, но в конечном решении это не практично, поскольку я не знаю сообщения, которое у меня будет. Разработчики, по-видимому, использовали «ParameterValue» в первом случае как массив, а во втором - как простую строку. Возможно ли иметь один фрагмент кода, который будет десериализовать оба сообщения? Если я использую код для первого сообщения во втором, поле ParameterValue представляет собой пустой массив.

== Первое сообщение ==

<Parameters>
  <Parameter>
    <ParameterName>ResponseCode</ParameterName>
    <ParameterValue>2</ParameterValue>
  </Parameter>
  <Parameter>
    <ParameterName>ResponseValue</ParameterName>
    <ParameterValue>
      <ReturnParameters>
        <ReturnParameter>
          <ParameterName>Data1</ParameterName>
          <ParameterValue>Parameter Not Found</ParameterValue>
        </ReturnParameter>
        <ReturnParameter>
          <ParameterName>Data2</ParameterName>
          <ParameterValue>Parameter Not Found</ParameterValue>
        </ReturnParameter>
      </ReturnParameters>
    </ParameterValue>
  </Parameter>
</Parameters>

== Второе сообщение ==

<Parameters>
  <Parameter>
    <ParameterName>ResponseCode</ParameterName>
    <ParameterValue>2</ParameterValue>
  </Parameter>
  <Parameter>
    <ParameterName>ResponseValue</ParameterName>
    <ParameterValue>Success</ParameterValue>
  </Parameter>
</Parameters>

1 Ответ

0 голосов
/ 14 декабря 2011

Добавьте mixed="true" к вашему XSD.Это говорит о том, что вы хотите объединить элементы XML с текстом.Это приведет к появлению поля Text в вашем классе C #.

http://www.w3schools.com/schema/schema_complex_mixed.asp

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Parameters" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Parameters" msdata:IsDataSet="true" msdata:Locale="en-US">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Parameter">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ParameterName" type="xs:string" minOccurs="0" />
              <xs:element name="ParameterValue" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType mixed="true">
                  <xs:sequence>
                    <xs:element name="ReturnParameters" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="ReturnParameter" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="ParameterName" type="xs:string" minOccurs="0" />
                                <xs:element name="ParameterValue" type="xs:string" minOccurs="0" />
                              </xs:sequence>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

public partial class ParametersParameterParameterValue {

    [System.Xml.Serialization.XmlArrayAttribute(
        Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]

    [System.Xml.Serialization.XmlArrayItemAttribute(
        "ReturnParameter", 
        typeof(ParametersParameterParameterValueReturnParametersReturnParameter), 
        Form=System.Xml.Schema.XmlSchemaForm.Unqualified, 
        IsNullable=false)]

    public ParametersParameterParameterValueReturnParametersReturnParameter[][] 
        ReturnParameters { get; set; }

    [System.Xml.Serialization.XmlTextAttribute()]
    public string[] Text { get; set; }
}
...