2012-03-27 80 views
2

我嘗試生成一些包含架構的xml文件。我使用jaxb從架構中創建xml文件,但是我無法在此xml.My中添加架構文件看起來像在java中使用xml架構創建xml文件

<transaction> 
    <xs:schema id="transaction" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="transaction" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
     <xs:complexType> 
     <xs:choice minOccurs="0" maxOccurs="unbounded"> 
      <xs:element name="id"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="in" type="xs:string" minOccurs="0" /> 
       <xs:element name="sn" type="xs:string" minOccurs="0" /> 
       <xs:element name="book" type="xs:string" minOccurs="0" /> 
       <xs:element name="author" type="xs:string" minOccurs="0" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
      <xs:element name="data"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="dateTime" type="xs:dateTime" minOccurs="0" /> 
       <xs:element name="key" type="xs:string" minOccurs="0" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
      <xs:element name="productData"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="dateTime" type="xs:dateTime" minOccurs="0" /> 
       <xs:element name="key" type="xs:string" minOccurs="0" /> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:choice> 
     </xs:complexType> 
    </xs:element> 
    </xs:schema> 
    <id> 
    <in>abcd</in> 
    <sn>1234567</sn> 
    <book>computer</book> 
    <author>klen</author> 
    </id> 
    <data> 
    <dateTime>2011-06-24T17:08:36.3727674+05:30</dateTime> 
    <key>Err</key> 
    </data> 
</transaction> 

,但到現在爲止,我能夠生成xml文件看起來像

<transaction> 
     <id> 
     <in>abcd</in> 
     <sn>1234567</sn> 
     <book>computer</book> 
     <author>klen</author> 
     </id> 
     <data> 
     <dateTime>2011-06-24T17:08:36.3727674+05:30</dateTime> 
     <key>Err</key> 
     </data> 
</transaction> 

我不知道如何下node.is有什麼辦法可以添加此架構添加此模式在節點下使用java.maain中的jaxb我的部分代碼就像

    transaction.getIdOrDataOrProductData().add(id); 
        transaction.getIdOrDataOrProductData().add(data); 
        transaction.getIdOrDataOrProductData().add(productdata); 
       JAXBContext jaxbContext = JAXBContext.newInstance(Transaction.class); 
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
      jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); 
        jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT,true); 
      jaxbMarshaller.marshal(transaction, file); 
      jaxbMarshaller.marshal(transaction, System.out); 

是否有任何方法來改變我可以添加模式與XML文件的代碼。
我們的應用程序實際上檢查文件結構,如果它看起來不像我給出的例子那麼它將被刪除,所以我應該遵循這個結構,它將更新數據庫。現在我的問題是,我該如何添加這個我的使用jaxb的xml文件。

使用C#.NET平臺它可以生成xml文件與schema.is它可能在java中。

+1

@Patrice Matignon你能告訴我如何發送這個模式對象,以及編組我可以使用模式生成xml文件的模式。 – saba 2012-03-28 18:47:16

+0

@Patrice Matignon對不起,我不清楚你能不能簡單地描述它其實我是java中的新手,所以我無法理解你的建議。其實我沒有改變我的模式,另一件事是我如何轉換將xslt轉換爲帶模式的xml。 – saba 2012-03-30 04:12:36

回答

1

您的模式中沒有任何內容表明模式本身應該添加到實例文檔中。

你會需要這樣的東西:

<xs:element name="transaction" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
    <xs:complexType> 
    <xs:choice minOccurs="0" maxOccurs="unbounded"> 
     <!-- Adding an element that can supports the schema definition --> 
     <xs:element ref="xs:schema" minOccurs="0" maxOccurs="1"/> 
     <!-- and from here on, what you already have : --> 
     <xs:element name="id"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="in" type="xs:string" minOccurs="0" /> 
      <xs:element name="sn" type="xs:string" minOccurs="0" /> 
      <xs:element name="book" type="xs:string" minOccurs="0" /> 
      <xs:element name="author" type="xs:string" minOccurs="0" /> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
     ... 

然後你不得不架構插入到你的交易JAXB對象爲它的實例文檔中出現。

現在,我想更多地瞭解您的使用案例:您確定需要這樣做嗎? 文檔本身(事務XML)可以簡單地指定它符合的模式,甚至指定一個位置,例如:

<transaction xmlns="urn:mytransactionschema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:schemaLocation="http://www.example.com/transaction.xsd" > 

這應該使實例文檔的消費者能夠更好地驗證XML,而不是將它包含在實例doc中。

+0

我們的應用程序實際上檢查文件結構,如果它看起來不像我給出的例子那麼它將被刪除,所以我應該遵循這個結構,它將更新數據庫。現在我的問題是,我該如何添加這個我的XML使用jaxb的文件。 – saba 2012-03-28 06:18:45

+0

你能告訴我如何發送這個模式對象,以及如何編組我可以用模式生成xml文件的模式。 – saba 2012-03-28 17:21:57

+2

問題是,在實例文檔中添加模式本身使得後者無法對前者進行驗證,這可能是錯誤的)。這就是爲什麼你的JAXB對象沒有API來開箱即可。我假設你無法改變模式,因爲有一個應用程序會消耗它(並且你不能自己改變)。我會以這種或那種方式使用XSLT將你的(靜態)模式注入你的編組文檔中(這個網站上有很多文章會幫助你實現)。 – 2012-03-29 00:33:24

0

我知道在.NET平臺上使用C#可以做到這一點,可以使用schema定義的xml文件。我認爲在Java中是不可能的。

+0

你確定嗎? – saba 2012-03-30 18:37:06