2011-12-14 56 views
2

我正在尝试与发送以下两条消息的硬件进行通信。在收到消息的时候,我不知道我得到了两个消息结构中的哪一个。 使用XSD,我已经取得了.xml文件,并分别为每个文件创建了.xsd和C#文件,但这在最终的解决方案中并不实用,因为我不知道我将得到的消息。开发者似乎在第一个实例中使用了'ParameterValue'作为数组,第二个作为一个简单的字符串。是否有可能会“反序列化”这两个消息的一段代码?如果我在第二条消息中使用第一条消息的代码,那么ParameterValue字段是一个空数组。XML元素和数组

==第一条消息==

<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> 

回答

0

添加mixed="true"到您的XSD。这就是说你想要将XML元素与文本结合起来。 这将导致C#类中的Text字段。

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; } 
} 
+0

不能相信它是那么容易。感谢您的快速回复。 – 2011-12-14 10:40:33