在java中使用xml架构创建xml文件

时间:2012-03-27 18:16:33

标签: java xml jaxb xsd

我尝试生成一些包含架构的xml文件。我使用jaxb从架构制作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中使用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文件添加模式的代码 我们的应用程序实际上检查文件结构,如果它看起来不像我的给定的例子然后它将被删除,所以我应该遵循这个结构,它将更新数据库。现在我的问题是,我怎么能添加这个我的xml文件使用jaxb。

使用C#.NET平台,可以使用schema生成xml文件。可以在java中使用。

2 个答案:

答案 0 :(得分: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,而不是将其包含在实例文档中。

答案 1 :(得分:0)

我知道在.NET平台上使用C#可以做到这一点,可以使用带有模式定义的xml文件。我认为在java中是不可能的。