解组具有不同命名空间的JAXB子级

时间:2015-10-29 08:57:41

标签: xsd namespaces jaxb unmarshalling

我是XML和JAXB的新手。我已经阅读了很多关于XML,名称空间声明等的内容,但我目前面临着JAXB的问题,我无法解决。关于EPO的回复文件有一个XSD file。我可以与我的客户一起调用EPO Web服务并获取返回文档。我将展示这样一个返回文档的第一行。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type='text/xsl' href='/3.0/style/rplus.xsl' ?>
<ns2:world-patent-data 
    xmlns:ns2="http://ops.epo.org" 
    xmlns:ns3="http://www.epo.org/register" 
    xmlns:ns4="http://www.w3.org/1999/xlink" 
    xmlns:ns5="http://www.epo.org/cpcexport" 
    xmlns:ns6="http://www.epo.org/cpcdefinition">
    <ns2:meta name="elapsed-time" value="15"/>
    <ns2:register-search total-result-count="1">
        <ns2:query syntax="CQL">application=EP99203729</ns2:query>
        <ns2:range begin="1" end="1"/>
        <ns3:register-documents produced-by="RO">
            <ns3:register-document date-produced="20151028" dtd-version="1.0" lang="en" produced-by="RO" status="NO OPPOSITION FILED WITHIN TIMELIMIT">
                ...
            </ns3:register-document>
        </ns3:register-documents>
    </ns2:register-search>
</ns2:world-patent-data >

如您所见,定义了多个名称空间,但只有两个在文档正文中使用,即ns2和ns3。我的问题是解组ns3:register-documents实体。我使用Netbeans来创建我的JAXB类。使用了EPO的XSD file。 Netbeans只创建了属于这个XSD的类,即没有生成n2:register-search或n2:world-patent-data类。我试过以下内容:我试图解组整个文档,并假设JAXB unmarshaller会自动找到ns3:register-documents元素,将其标识为root并返回它。我还尝试使用XPATH从XML文档中提取ns3:register-documents元素,并仅解组此元素。这也行不通。抛出 javax.xml.bind.UnmarshalException:意外元素。我想我必须告诉JAXB,ns3:register-documents开始的地方,它所属的命名空间等等。不幸的是,我不知道该怎么做。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可能已从该角落下载了所有XML模式并生成了所有Java类,包括通信层的类。但是,我可以同情你,避免所有那些额外的麻烦: - )

但是现在你必须做一些明确的XML处理:将XML解析为DOM树,获取你感兴趣的节点并从中解组。以下是:

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
    DocumentBuilder db = dbf.newDocumentBuilder();
        dbf.setNamespaceAware(true);
    Document document = db.parse(new File( "xxx.xml" ) );
    Element rootNode = document.getDocumentElement();
    if (! rootNode.getLocalName().equals("world-patent-data")) {
        throw new IllegalStateException( "bad document" );
    }
    NodeList infos = 
        rootNode.getElementsByTagNameNS("http://ops.epo.org", "register-search");
    if( infos.getLength() == 0 ){
        throw new IllegalStateException( "not a register search" );
    }   
    Element info = (Element)infos.item(0);
    NodeList docs = 
        info.getElementsByTagNameNS("http://www.epo.org/register", "register-documents");
    if( docs.getLength() == 0 ){
        throw new IllegalStateException( "no register-documents" );
    }   
    Element newTop = (Element)docs.item(0);
    System.out.println( newTop.getTagName() );
    JAXBContext jc = JAXBContext.newInstance( "org.epo.register" );
    Unmarshaller u = jc.createUnmarshaller();
    JAXBElement jbe = 
        (JAXBElement)u.unmarshal( newTop );
    RegisterDocuments rds = jbe.getValue();
    System.out.println( rds.getProducedBy() );