2012-10-26 40 views
0

我使用Microsoft SDK中的xsd.exe首先生成xml文件的模式,然後生成以前生成的xsd文件的C#文件。 這裏是我的xml文件:xsd.exe忽略cdata?

<event topic="event.system.visualization.initialization.response" subject="CIBEK204Test0" producer="de.cibek.configurator" timeToLive="0" too="1351252459919" duration="0"> 
<payload> 
    <![CDATA[ 
     <?xml version="1.0" encoding="UTF-8" standalone="no"?> 
      <building> 
       <floor name=""> 
        <location name="Wohnen"> 
         <item category="event.environment.apartment.window" groupaddress="10248" location="Wohnen" location.floor="" location.specification="Mitte links"/> 
        </location> 
       </floor> 
      </building> 
    ]]> 
</payload> 
<properties/> 
<traces/> 

現在生成的XSD:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
<xs:element name="event"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="payload" type="xs:string" minOccurs="0" msdata:Ordinal="0" /> 
    <xs:element name="properties" type="xs:string" minOccurs="0" msdata:Ordinal="1" /> 
    <xs:element name="traces" type="xs:string" minOccurs="0" msdata:Ordinal="2" /> 
    </xs:sequence> 
    <xs:attribute name="topic" type="xs:string" /> 
    <xs:attribute name="subject" type="xs:string" /> 
    <xs:attribute name="producer" type="xs:string" /> 
    <xs:attribute name="timeToLive" type="xs:string" /> 
    <xs:attribute name="too" type="xs:string" /> 
    <xs:attribute name="duration" type="xs:string" /> 
</xs:complexType> 
</xs:element> 
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
    <xs:complexType> 
    <xs:choice minOccurs="0" maxOccurs="unbounded"> 
    <xs:element ref="event" /> 
    </xs:choice> 
</xs:complexType> 
</xs:element> 
</xs:schema> 

而產生的CS文件:

using System.Xml.Serialization; 

// 
// This source code was auto-generated by xsd, Version=4.0.30319.17929. 
// 


/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class @event { 

private string payloadField; 

private string propertiesField; 

private string tracesField; 

private string topicField; 

private string subjectField; 

private string producerField; 

private string timeToLiveField; 

private string tooField; 

private string durationField; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public string payload { 
    get { 
     return this.payloadField; 
    } 
    set { 
     this.payloadField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public string properties { 
    get { 
     return this.propertiesField; 
    } 
    set { 
     this.propertiesField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] 
public string traces { 
    get { 
     return this.tracesField; 
    } 
    set { 
     this.tracesField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlAttributeAttribute()] 
public string topic { 
    get { 
     return this.topicField; 
    } 
    set { 
     this.topicField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlAttributeAttribute()] 
public string subject { 
    get { 
     return this.subjectField; 
    } 
    set { 
     this.subjectField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlAttributeAttribute()] 
public string producer { 
    get { 
     return this.producerField; 
    } 
    set { 
     this.producerField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlAttributeAttribute()] 
public string timeToLive { 
    get { 
     return this.timeToLiveField; 
    } 
    set { 
     this.timeToLiveField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlAttributeAttribute()] 
public string too { 
    get { 
     return this.tooField; 
    } 
    set { 
     this.tooField = value; 
    } 
} 

/// <remarks/> 
[System.Xml.Serialization.XmlAttributeAttribute()] 
public string duration { 
    get { 
     return this.durationField; 
    } 
    set { 
     this.durationField = value; 
    } 
} 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class NewDataSet { 

private @event[] itemsField; 

/// <remarks/> 
[System.Xml.Serialization.XmlElementAttribute("event")] 
public @event[] Items { 
    get { 
     return this.itemsField; 
    } 
    set { 
     this.itemsField = value; 
    } 
} 
} 

現在我的問題是:爲什麼xsd.exe忽略CDATA中嵌入的xml代碼?有沒有可能迫使xsd.exe不忽略CDATA?或者是否有可能生成2個xsd和cs文件,並告訴第一個文件(帶有事件)中有一個CDATA節點,其中包含另一個xml文件並將它們鏈接到生成的代碼中?

很抱歉的長期職位,我希望有人能幫助我:)

回答

0

我成功反序列化CDATA通過使用XSD.EXE和以下XSD文件:

<xs:element name="event"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="payload" minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<xs:element name="payload"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"/> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

通過XSD.EXE生成的代碼是:

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class @event { 

    private payload[] payloadField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("payload")] 
    public payload[] payload { 
     get { 
      return this.payloadField; 
     } 
     set { 
      this.payloadField = value; 
     } 
    } 
} 

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class payload { 

    private string valueField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlTextAttribute()] 
    public string Value { 
     get { 
      return this.valueField; 
     } 
     set { 
      this.valueField = value; 
     } 
    } 
} 

而使用的XmlSerializer 。串行化填充有效載荷。價值與CData