我正在尝试使用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&auml;ffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), "Gapped BLAST and PSI-BLAST: a new generation of protein database search programs", 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文件,为此我需要这个。
答案 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模式(jaxb)生成带有JSR-222(xsd)注释的Java类。 XML Schema是定义xml文档结构的标准方法(参见:http://www.w3.org/XML/Schema)。获得生成的类后,可以将它们与JAXB实现一起使用,以解析/创建符合该XML Schema的文档。
您问题中的XML符合文档类型定义(dtd)。 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);
}
}