Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xsd 使用不同名称空间解组JAXB子级_Xsd_Namespaces_Jaxb_Unmarshalling - Fatal编程技术网

Xsd 使用不同名称空间解组JAXB子级

Xsd 使用不同名称空间解组JAXB子级,xsd,namespaces,jaxb,unmarshalling,Xsd,Namespaces,Jaxb,Unmarshalling,我不熟悉XML和JAXB。我已经读了很多关于XML、名称空间声明等的书,但我目前面临一个JAXB问题,我无法解决。EPO上有一个关于响应文档的问题。我可以通过我的客户机调用EPO web服务并获取返回文档。我将显示这样一个返回文档的第一行 应用程序=EP99203729 ... 如您所见,定义了多个名称空间,但文档正文中只使用了两个名称空间,即ns2和ns3。我的问题是解组ns3:register documents实体。我使用Netbeans创建我的JAXB类。使用EPO提供的数据。Net

我不熟悉XML和JAXB。我已经读了很多关于XML、名称空间声明等的书,但我目前面临一个JAXB问题,我无法解决。EPO上有一个关于响应文档的问题。我可以通过我的客户机调用EPO web服务并获取返回文档。我将显示这样一个返回文档的第一行


应用程序=EP99203729
...

如您所见,定义了多个名称空间,但文档正文中只使用了两个名称空间,即ns2和ns3。我的问题是解组ns3:register documents实体。我使用Netbeans创建我的JAXB类。使用EPO提供的数据。Netbeans只创建了属于这个XSD的类,即没有生成n2:注册搜索或n2:世界专利数据类。我尝试了以下方法:我尝试对整个文档进行解组,并假设JAXB解组器将自动找到ns3:register documents元素,将其标识为root并返回它。我还尝试使用XPATH从XML文档中提取ns3:register documents元素,并仅对该元素进行解组。这也不起作用。一个javax.xml.bind.unmarshaleException:抛出意外元素。我想我必须告诉JAXB,ns3:register文档从哪里开始,它属于哪个名称空间等等。不幸的是,我不知道怎么做。非常感谢您的帮助。

您可能已经从那个角落下载了所有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() ); DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); DocumentBuilder db=dbf.newDocumentBuilder(); dbf.setNamespaceAware(true); documentdocument=db.parse(新文件(“xxx.xml”); Element rootNode=document.getDocumentElement(); 如果(!rootNode.getLocalName().equals(“世界专利数据”)){ 抛出新的非法状态异常(“坏文档”); } 节点列表信息= rootNode.GetElementsByTagnames(“http://ops.epo.org“,”注册检索“); if(infos.getLength()==0){ 抛出新的非法状态异常(“非寄存器搜索”); } 元素信息=(元素)信息项(0); 节点列表文档= info.getElementsByTagnames(“http://www.epo.org/register“,”注册文件“); 如果(docs.getLength()==0){ 抛出新的非法状态例外(“无注册文件”); } 元素newTop=(元素)单据项(0); System.out.println(newTop.getTagName()); JAXBContext jc=JAXBContext.newInstance(“org.epo.register”); 解组器u=jc.createUnmarshaller(); JAXBElement jbe= (JAXBElement)u.unmarshal(newTop); RegisterDocuments rds=jbe.getValue(); System.out.println(rds.getProducedBy());