Xsd JAXB/XJC:处理多个名称空间(元素不包含任何子节点)

Xsd JAXB/XJC:处理多个名称空间(元素不包含任何子节点),xsd,jaxb,xml-namespaces,xjc,Xsd,Jaxb,Xml Namespaces,Xjc,我试图创建一个XSD模式,用XJC/JAXB处理以下本体: (我知道RDF没有模式,但是这个文件的格式总是相同的)。该文件看起来像: <go:go xmlns:go="http://www.geneontology.org/dtds/go.dtd#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:RDF> <go:term rdf:about="http://ww

我试图创建一个XSD模式,用XJC/JAXB处理以下本体:

(我知道RDF没有模式,但是这个文件的格式总是相同的)。该文件看起来像:

<go:go xmlns:go="http://www.geneontology.org/dtds/go.dtd#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    <rdf:RDF>
        <go:term rdf:about="http://www.geneontology.org/go#GO:0000001">
            <go:accession>GO:0000001</go:accession>
            <go:name>mitochondrion inheritance</go:name>
            <go:synonym>mitochondrial inheritance</go:synonym>
            <go:definition>The distribution of mitochondria, including the mitochondrial genome, into daughter cells after mitosis or meiosis, mediated by
 interactions between mitochondria and the cytoskeleton.</go:definition>
            <go:is_a rdf:resource="http://www.geneontology.org/go#GO:0048308" />
            <go:is_a rdf:resource="http://www.geneontology.org/go#GO:0048311" />
        </go:term>
        <go:term rdf:about="http://www.geneontology.org/go#GO:0000002">
       (...)
但是,在使用XJC编译xsd并运行下面的java程序之后,我没有得到go:term的主体:

import java.io.InputStream;
import java.io.StringWriter;
import org.geneontology.dtds.go.*;
import org.w3._1999._02._22_rdf_syntax_ns.*;
import javax.xml.namespace.QName;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Marshaller;
import  javax.xml.transform.stream.StreamSource;


public class TestGo
    {
    public static void main(String[] args) throws Exception
        {
    JAXBContext jaxbCtxt=JAXBContext.newInstance(JAXBContext.newInstance("org.geneontology.dtds.go:org.w3._1999._02._22_rdf_syntax_ns");
    Marshaller marshaller = jaxbCtxt.createMarshaller();
    Unmarshaller unmarshaller=jaxbCtxt.createUnmarshaller();
        marshaller.setProperty("jaxb.formatted.output",true);
        Go go=unmarshaller.unmarshal( new StreamSource(System.in), Go.class).getValue();
        marshaller.marshal(new JAXBElement<Go>(
            new QName("http://www.geneontology.org/dtds/go.dtd#", "go"),
            Go.class,
            go
            ), System.out);
        }
    }
import java.io.InputStream;
导入java.io.StringWriter;
导入org.geneontology.dtds.go.*;
导入org.w3.\u 1999.\u 02.\u 22.\u rdf.\u语法。*;
导入javax.xml.namespace.QName;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.Unmarshaller;
导入javax.xml.bind.Marshaller;
导入javax.xml.transform.stream.StreamSource;
公共类TestGo
{
公共静态void main(字符串[]args)引发异常
{
JAXBContext jaxbCtxt=JAXBContext.newInstance(JAXBContext.newInstance(“org.geneontology.dtds.go:org.w3._1999._02._22_rdf_syntax”);
Marshaller=jaxbCtxt.createMarshaller();
Unmarshaller Unmarshaller=jaxbCtxt.createUnmarshaller();
setProperty(“jaxb.formatted.output”,true);
Go-Go=unmarshaller.unmarshal(新的StreamSource(System.in),Go.class.getValue();
元帅,元帅(
新QName(“http://www.geneontology.org/dtds/go.dtd#","去",,
去上课,
去
),System.out);
}
}
编译并运行:

xjc -d tmp ../schemas/bio/go/go.xsd
javac -d tmp -sourcepath tmp:. TestGo.java
java -cp tmp TestGo < go.xml | head -n 20
xjc-dtmp../schemas/bio/go/go.xsd
javac-d tmp-sourcepath tmp:.TestGo.java
java-cp tmp TestGo
输出:

<ns3:go xmlns:ns2="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns3="http://www.geneontology.org/dtds/go.dtd#">
    <ns2:RDF>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0000001"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0000002"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0000003"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0000005"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0042254"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0044183"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0051082"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0000006"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0000007"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0000008"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0003756"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0015036"/>
        <ns3:term ns2:about="http://www.geneontology.org/go#GO:0000009"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:go xmlns:ns2="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns3="http://www.geneontology.org/dtds/go.dtd#">
<ns2:RDF>
<ns3:term ns2:about="uri:0">
 <accession>Hello0</accession>
</ns3:term>
<ns3:term ns2:about="uri:1">
  <accession>Hello1</accession>
</ns3:term>
</ns2:RDF>
</ns3:go>

出什么问题了?如何获取“go:term”的主体?这是处理组的正确方法吗(例如:xsd:group name=“goterm”在我看来很难看)

编辑:根据Blaise的评论更改了JAXBContext.newInstance

编辑:Blaise的第二个java代码

import java.io.InputStream;
import java.io.StringWriter;
import org.geneontology.dtds.go.*;
import org.w3._1999._02._22_rdf_syntax_ns.*;
import javax.xml.namespace.QName;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Marshaller;
import  javax.xml.transform.stream.StreamSource;


public class TestGo2
    {
    public static void main(String[] args) throws Exception
        {
        Go go=new Go();
        RDF rdf=new RDF();
        go.setRDF(rdf);
        for(int i=0;i<2;++i)
            {
            Term t=new Term();
            t.setAbout("uri:"+i);
            t.setAccession("Hello"+i);
            rdf.getTerm().add(t);
            }

    JAXBContext jaxbCtxt=JAXBContext.newInstance("org.geneontology.dtds.go:org.w3._1999._02._22_rdf_syntax_ns");
    Marshaller marshaller = jaxbCtxt.createMarshaller();

        marshaller.marshal(new JAXBElement<Go>(
            new QName("http://www.geneontology.org/dtds/go.dtd#", "go"),
            Go.class,
            go
            ), System.out);
        }
    }
import java.io.InputStream;
导入java.io.StringWriter;
导入org.geneontology.dtds.go.*;
导入org.w3.\u 1999.\u 02.\u 22.\u rdf.\u语法。*;
导入javax.xml.namespace.QName;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.JAXBElement;
导入javax.xml.bind.Unmarshaller;
导入javax.xml.bind.Marshaller;
导入javax.xml.transform.stream.StreamSource;
公共类TestGo2
{
公共静态void main(字符串[]args)引发异常
{
Go Go=新Go();
RDF RDF=新的RDF();
go.setRDF(rdf);
对于(int i=0;i$@
清洁:
rm-rf tmp go.xml

尝试的第一件事是在生成的包的
字符串
上创建
JAXBContext
,而不是其中一个类:

JAXBContext jc = JAXBContext.newInstance("org.geneontology.dtds.go:org.w3._1999._02._22_rdf_syntax_ns");
演示

导入java.io.File;
导入javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(“org.geneontology.dtds.go:org.w3._1999._02._22_rdf_语法”);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
文件xml=新文件(“src/forum14236188/input.xml”);
对象o=unmarshaller.unmarshal(xml);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
元帅(o,系统输出);
}
}
input.xml/Output


GO:0000001
线粒体遗传
线粒体遗传
线粒体的分布,包括
线粒体基因组,在有丝分裂或减数分裂后进入子细胞,
调解
线粒体和细胞骨架之间的相互作用。

谢谢,我已将其更改为JAXBContext.newInstance(“org.geneontology.dtds.go:org.w3.\u 1999.\u 02.\u 22\u rdf\u syntax”);但我得到了相同的结果。@Pierre-您是否尝试整理出一个对象模型并将其与输入进行比较?这有助于找到映射需要正确的位置。@Pierre-我已更新了我的答案。根据您问题中的信息,一切似乎都运行正常。嗯……这里不起作用。go:Term仍然为空。xjc版本为2.2.4,javac是1.7.0_01:-/@Pierre-我使用的是XJC版本2.2.4和64位JDK build 1.7.0_04-b21,用于Mac。问题可能出在您的makefile上。我只是运行了XJC命令行,并将这些类引入Eclipse来做一个示例。
import java.io.InputStream;
import java.io.StringWriter;
import org.geneontology.dtds.go.*;
import org.w3._1999._02._22_rdf_syntax_ns.*;
import javax.xml.namespace.QName;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.Marshaller;
import  javax.xml.transform.stream.StreamSource;


public class TestGo2
    {
    public static void main(String[] args) throws Exception
        {
        Go go=new Go();
        RDF rdf=new RDF();
        go.setRDF(rdf);
        for(int i=0;i<2;++i)
            {
            Term t=new Term();
            t.setAbout("uri:"+i);
            t.setAccession("Hello"+i);
            rdf.getTerm().add(t);
            }

    JAXBContext jaxbCtxt=JAXBContext.newInstance("org.geneontology.dtds.go:org.w3._1999._02._22_rdf_syntax_ns");
    Marshaller marshaller = jaxbCtxt.createMarshaller();

        marshaller.marshal(new JAXBElement<Go>(
            new QName("http://www.geneontology.org/dtds/go.dtd#", "go"),
            Go.class,
            go
            ), System.out);
        }
    }
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:go xmlns:ns2="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:ns3="http://www.geneontology.org/dtds/go.dtd#">
<ns2:RDF>
<ns3:term ns2:about="uri:0">
 <accession>Hello0</accession>
</ns3:term>
<ns3:term ns2:about="uri:1">
  <accession>Hello1</accession>
</ns3:term>
</ns2:RDF>
</ns3:go>
JAVA_HOME:=$(dir $(shell which java))..
JAVAC=${JAVA_HOME}/bin/javac
JAVA=${JAVA_HOME}/bin/java
XJC?=${JAVA_HOME}/bin/xjc

.PHONY=all go clean
all:go

go: go.xml
    -xmllint  --noout --schema ../schemas/bio/go/go.xsd $<
    mkdir -p tmp
    ${XJC} -d tmp ../schemas/bio/go/go.xsd 
    ${JAVAC} -d tmp -sourcepath tmp:. TestGo.java `find tmp -name "ObjectFactory.java"`
    ${JAVA}  -cp tmp TestGo < $< | head -n 20
    #rm -rf tmp

go.xml:
    curl "http://archive.geneontology.org/latest-termdb/go_daily-termdb.rdf-xml.gz" |\
    gunzip -c | grep -v "<!DOCTYPE " > $@

clean:
    rm -rf tmp go.xml
JAXBContext jc = JAXBContext.newInstance("org.geneontology.dtds.go:org.w3._1999._02._22_rdf_syntax_ns");