是否有一个java API来生成带有内联架构定义的xml

时间:2012-03-30 17:34:36

标签: java xml java-ee xsd

我想生成保存其架构的xml文件以及使用java包含的xml数据,据我所知,它可以在C#.NET中使用。它可以在java ???

我的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>computer</in>
    <sn>1234567</sn>
    <book>JAVA</book>
    <author>klen</author>
  </id>
  <data>
    <dateTime>2011-06-24T17:08:36.3727674+05:30</dateTime>
    <key>Err</key>
  </data>
</transaction>

在我给出的示例中,我的xml文件包含数据以及我需要使用java从模式生成此类文件所需的模式。

我只能使用jaxb创建xml部分,我的代码的主要部分看起来像

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架构部分。

@jtahlborn好的我会尝试挖掘它感谢你的帮助。我还有另一个问题,我听说stax比dom更好地写xml,所以我想用stax是否可以设置命名空间和其他东西。我有另一个问题是,jaxb仅用于将xml转换为xml架构(un marshaling)和xml架构转换为xml(编组),如果我需要编写xml文件,那么我们需要使用jaxb [DOM,STAX(stream)基于阅读写作),SAX(仅流阅读)]。

1 个答案:

答案 0 :(得分:1)

你会:

  1. 从架构中创建DOM文档(例如,解析架构文件)
  2. 创建新的DOM文档
  3. 将根节点添加到新DOM文档(例如“transaction”)
  4. 将步骤1中的架构文档附加为“transaction”元素的第一个子元素
  5. 将实际文档数据附加为“transaction”元素的后续子元素
  6. 或者,如果您想使用JAXB生成“主”xml输出,那么您可以:

    1. 填充jaxb模型(从架构创建)
    2. 将jaxb模型编组为DOM文档
    3. 从架构中创建DOM文档(例如,解析架构文件)
    4. 插入第3步中的架构文档,作为DOM文档中“transaction”元素的第一个子元素
    5. (使用一些jaxb配置技巧,您可能会让您的Transaction模型具有Element“schema”属性,然后您可以从解析的模式doc设置该属性并一次编组整个模型)