1

我正在尝试使用 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 文件,为此我需要它。

4

2 回答 2

3

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

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

于 2013-07-18T04:06:24.660 回答
1

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

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

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

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

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);
    }

}
于 2013-07-18T02:25:34.910 回答