2013-11-22 63 views
0

我想用C#使用現有的XSD文件構建一個新的XML文件。 這是XSD文件:用XSD文件在C#中生成XML文件

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="KilometerUpload"> 
<xsd:complexType> 
    <xsd:sequence> 
     <xsd:element minOccurs="1" maxOccurs="unbounded" name="KilometerRegistration"> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element name="ChassisNumber"> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="17" /> 
           <xsd:minLength value="1" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
        <xsd:element name="KilometerStatus"> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="7" /> 
           <xsd:minLength value="1" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
        <xsd:element name="TypeOfData"> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="3" /> 
           <xsd:minLength value="1" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
        <xsd:element name="ObservationDate"> 
         <xsd:annotation> 
          <xsd:documentation>Format: yyyyMMdd</xsd:documentation> 
         </xsd:annotation> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="8" /> 
           <xsd:minLength value="8" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
        <xsd:element name="LegallyResponsible"> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="10" /> 
           <xsd:minLength value="10" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
        <xsd:element name="EnteredBy"> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="10" /> 
           <xsd:minLength value="10" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
        <xsd:element name="InternalCode"> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="10" /> 
           <xsd:minLength value="0" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
        <xsd:element name="DateFirstRegistration"> 
         <xsd:annotation> 
          <xsd:documentation>Format: yyyyMMdd</xsd:documentation> 
         </xsd:annotation> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="8" /> 
           <xsd:minLength value="0" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
        <xsd:element name="Unifier"> 
         <xsd:simpleType> 
          <xsd:restriction base="xsd:string"> 
           <xsd:maxLength value="2" /> 
           <xsd:minLength value="0" /> 
          </xsd:restriction> 
         </xsd:simpleType> 
        </xsd:element> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
    <xsd:attribute name="FeedbackType" type="FeedbackType" use="optional"/> 
    <xsd:attribute name="FeedbackEmail" type="xsd:string" use="optional"/> 
</xsd:complexType> 
</xsd:element> 
<xsd:simpleType name="FeedbackType"> 
<xsd:annotation> 
    <xsd:documentation>The feedback type for this file</xsd:documentation> 
</xsd:annotation> 
<xsd:restriction base="xsd:string"> 
    <xsd:enumeration value="FTP" /> 
    <xsd:enumeration value="EML" /> 
    <xsd:enumeration value="DEF" /> 
</xsd:restriction> 
</xsd:simpleType> 
</xsd:schema> 

我做下面的事情來創建XML文件:

  • 做了一個類XSD.EXE
  • 我加入了類,我的項目
  • 寫了如下的功能:

       var data = new KilometerUploadKilometerRegistration 
          { 
          ChassisNumber = huidigefactuur.Wagen.Chassisnummer, 
          KilometerStatus = huidigefactuur.KMStand.ToString(), 
          TypeOfData = "120", 
    
          }; 
          var serializer = new XmlSerializer(typeof(KilometerUploadKilometerRegistration)); 
          using (var stream = new StreamWriter("C:\\test.xml")) 
           serializer.Serialize(stream, data); 
    

它正在創建XML文件,但我需要從KilometerUpload節點開始,而不是KilometerRegistration節點,我該怎麼做?

這是輸出我的代碼讓我上面使用:

<?xml version="1.0" encoding="UTF-8"?> 

-<KilometerUploadKilometerRegistration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<ChassisNumber>WVWZZZ3CZ7E201402</ChassisNumber> 

<KilometerStatus>78000</KilometerStatus> 

<TypeOfData>120</TypeOfData> 

</KilometerUploadKilometerRegistration> 

謝謝!

回答

2

我已經找到了答案:

  • 我並不需要改變由XSD生成的我的課。EXE

這是我結束的代碼,它完美的作品現在:

   foreach (Factuur huidigeFactuur2 in e.SelectedObjects) 
      { 
       XmlSerializer serializer2 = new XmlSerializer(typeof(KilometerUpload)); 
       TextWriter writer = new StreamWriter(@"C:\test2.xml"); 

       string chassisnummer = huidigeFactuur2.Wagen.Chassisnummer; 
       string kilometerstatus = huidigeFactuur2.KMStand.ToString(); 

       KilometerUpload item = new KilometerUpload 
       { 
        KilometerRegistration = new KilometerUploadKilometerRegistration[] { new KilometerUploadKilometerRegistration{ ChassisNumber = chassisnummer , TypeOfData = "120", KilometerStatus = kilometerstatus} }, 
       }; 

       serializer2.Serialize(writer, item); 
0

要編寫一個xml文件,你可以使用XmlWriter類。

這裏是一個教程

http://www.dotnetperls.com/xmlwriter

+0

是不是有使用XML serializatin較短的方法嗎?我已經用這段簡短的代碼生成了一個xml文件,但是我需要不同的節點 –

+0

我用我的代碼現在生成的輸出更新了我的問題。正如你可以看到我的起始節點是千米更新千克註冊這不是我想要我的第一個節點需要千米上載和第二個節點千米註冊 –

1

您的串行器爲KilometerUpdateKilometerRegistration你試圖設置在

var serializer = new XmlSerializer(typeof(kilometerUpload)); 
+0

我還沒有嘗試過。序列化程序可以與var數據不同嗎? –

+0

我試圖在Kilometerupload上設置序列化器,但是當我運行它時,出現此錯誤:「生成XML文檔時出錯」 –

0

從XSD代碼構建XML將被煩人。在過去,我使用Priya Lakshminarayanan的XMLSampleGenerator。該特定項目的源代碼被發現here

我需要做你想做的事情,但是視覺工作室的示例代是不夠的。我提供的XmlSampleGenerator鏈接與VS示例生成類似,但顯然你有源代碼,因此可以根據需要進行調試和調整(在我的情況下,我需要適當的示例正則表達式生成)。

一句警告:從xsd生成xml是不容易的任務,所以不要指望它是。祝你好運。

編輯:此代碼將生成一個Xml,其中還包含一個KilometerUpload節點。

namespace XmlGen { 
public class Program { 
    private static void Main(string[] args) { 

     XmlSerializer serializer = new XmlSerializer(typeof(XmlItem)); 
     TextWriter writer = new StreamWriter(@"C:\Users\hasch\Downloads\test.xml"); 
     XmlItem item = new XmlItem(); 
     serializer.Serialize(writer,item); 
    } 
} 



public class XmlItem { 

    public KilometerUpload KilometerUpload; 

    public KilometerRegistration KilometerRegistration; 

    public XmlItem() { 
     KilometerUpload = new KilometerUpload(); 
     KilometerRegistration = new KilometerRegistration(); 
    } 
} 

public class KilometerUpload { 


} 

public class KilometerRegistration { 

    public string ChassisNumber { get; set; } 

    public string KilometerStatus { get; set; } 

    public string TypeOfData { get; set; } 

    public KilometerRegistration() { 
     ChassisNumber = "WVWZZZ3CZ7E201402"; 

     KilometerStatus = "78000"; 

     TypeOfData = "120"; 

    }}} 

這是生成的XML:

<?xml version="1.0" encoding="utf-8"?> 
    <XmlItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >      
<KilometerUpload /> 
<KilometerRegistration> 
    <ChassisNumber>WVWZZZ3CZ7E201402</ChassisNumber> 
    <KilometerStatus>78000</KilometerStatus> 
    <TypeOfData>120</TypeOfData> 
</KilometerRegistration> 

千萬記住,這其實不是從XSD生成XML!如果您的xsd發生變化,您將不得不對您的課程等進行重大更改。

+0

我認爲我非常接近,我只需要1個節點添加到XML文件中,它就是完成。但我只是不知道如何將KilometerUpdateKilometerRegistration節點拆分爲2. –

+0

我不知道我的理解。您希望KilometerUpdateKilometerRegistration確實存在兩次嗎?喜歡不同的數據?或者你的意思是缺少一個子節點(例如ObservationDate)?你在使用上面發佈的XmlSerializer解決方案嗎? – hschne

+0

是的,我正在使用上述的XMLSerializer。問題是現在我有1個節點:千米更新千克註冊。我需要2個節點,第一個KilometerUpdate比Kilometerregistration更像我的XSD文件。 –