我是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开始的地方,它所属的命名空间等等。不幸的是,我不知道该怎么做。非常感谢您的帮助。
答案 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() );