为什么JAXB的xjc的XML文件输入与我的不同?

时间:2013-07-18 00:30:14

标签: java xml jaxb xjc

我正在尝试使用JAXB的xjc从XML创建Java类,但在我遵循的所有示例中,我看到XML就像:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="employee" type="employee"/>

  <xs:complexType name="employee">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="salary" type="xs:double"/>
      <xs:element name="designation" type="xs:string" minOccurs="0"/>
      <xs:element name="address" type="address" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:int" use="required"/>
  </xs:complexType>

  <xs:complexType name="address">
    <xs:sequence>
      <xs:element name="city" type="xs:string" minOccurs="0"/>
      <xs:element name="line1" type="xs:string" minOccurs="0"/>
      <xs:element name="line2" type="xs:string" minOccurs="0"/>
      <xs:element name="state" type="xs:string" minOccurs="0"/>
      <xs:element name="zipcode" type="xs:long"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

和我的相似:

<?xml version="1.0"?>
<!DOCTYPE BlastOutput PUBLIC "-//NCBI//NCBI BlastOutput/EN" "http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd">
<BlastOutput>
  <BlastOutput_program>blastp</BlastOutput_program>
  <BlastOutput_version>BLASTP 2.2.28+</BlastOutput_version>
  <BlastOutput_reference>Stephen F. Altschul, Thomas L. Madden, Alejandro A. Sch&amp;auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), &quot;Gapped BLAST and PSI-BLAST: a new generation of protein database search programs&quot;, Nucleic Acids Res. 25:3389-3402.</BlastOutput_reference>
  <BlastOutput_db>nr</BlastOutput_db>
  <BlastOutput_query-ID>59663</BlastOutput_query-ID>
  <BlastOutput_query-def>unnamed protein product</BlastOutput_query-def>
  <BlastOutput_query-len>59</BlastOutput_query-len>
  <BlastOutput_param>
    <Parameters>
      <Parameters_matrix>BLOSUM62</Parameters_matrix>
      <Parameters_expect>10</Parameters_expect>
      <Parameters_gap-open>11</Parameters_gap-open>
      <Parameters_gap-extend>1</Parameters_gap-extend>
      <Parameters_filter>F</Parameters_filter>
    </Parameters>
  </BlastOutput_param>
<BlastOutput_iterations>
<Iteration>
  <Iteration_iter-num>1</Iteration_iter-num>
  <Iteration_query-ID>59663</Iteration_query-ID>
  <Iteration_query-def>unnamed protein product</Iteration_query-def>
  <Iteration_query-len>59</Iteration_query-len>
<Iteration_hits>
<Hit>
  <Hit_num>1</Hit_num>
  <Hit_id>gi|28592|emb|CAA23754.1|</Hit_id>
  <Hit_def>serum albumin [Homo sapiens]</Hit_def>
  <Hit_accession>CAA23754</Hit_accession>
  <Hit_len>609</Hit_len>
  <Hit_hsps>
    <Hsp>
      <Hsp_num>1</Hsp_num>
      <Hsp_bit-score>126.716</Hsp_bit-score>
      <Hsp_score>317</Hsp_score>
      <Hsp_evalue>2.38539e-38</Hsp_evalue>
      <Hsp_query-from>1</Hsp_query-from>
      <Hsp_query-to>59</Hsp_query-to>
      <Hsp_hit-from>1</Hsp_hit-from>

依旧......

我该怎么办? 我最初试图使用它来解析balst xml文件,为此我需要这个。

2 个答案:

答案 0 :(得分:3)

XJC用于从XSD文件(XML Schema)创建JAVA类,而不是从XML创建。如果要填充使用XJC生成的java类的对象,则可以考虑使用JAXB。

JAXB是一种XML-to-Java绑定技术,支持模式和Java对象之间以及XML实例文档和Java对象实例之间的转换。 JAXB技术由运行时API和附带的工具组成,这些工具可简化对XML文档的访问。您可以使用JAXB API和工具在Java类和XML模式之间建立映射。 XML模式定义XML文档的数据元素和结构。 JAXB技术提供了一个运行时环境,使您能够将XML文档与Java对象进行转换。无需了解XML数据结构即可访问存储在XML文档中的数据。

答案 1 :(得分:1)

XJC用于从XML模式()生成带有JSR-222)注释的Java类。 XML Schema是定义文档结构的标准方法(参见:http://www.w3.org/XML/Schema)。获得生成的类后,可以将它们与JAXB实现一起使用,以解析/创建符合该XML Schema的文档。

您问题中的XML符合文档类型定义()。 DTD文件是定义XML文档结构的另一种方法。您可以使用-dtd选项运行XJC工具,以便从DTD生成JAXB类。

xjc -d out -p com.example.blastoutput  -dtd http://www.ncbi.nlm.nih.gov/dtd/NCBI_BlastOutput.dtd

下面是一个JAXB代码示例,它展示了如何将XML文档转换为生成的类的实例,然后再转换回XML。请注意我们如何在我们在XJC调用中指定的包名创建JAXBContext

package com.example.blastoutput;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance("com.example.blastoutput");

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/com/example/blastoutput/input.xml");
        BlastOutput blastOutput = (BlastOutput) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(blastOutput, System.out);
    }

}