这让我发疯,我正在开发一个需要我解析XML文档(UBL格式)的项目。
这些文档可能在其正文中有一个或多个附件(base64编码),我的工作就是将它们删除。 我还需要获取其他一些字段(其中一些工作),为简洁起见,我将命名空间重命名为“A:”,“B:”等等
示例xml(大大简化)
<Invoice>
<A:ID>*someID*</A:ID>
<B:AdditionalDocumentReference>
<A:ID>attachmentID</A:ID>
<B:OrderReference>
<A:ID>16009896</A:ID>
</B:OrderReference>
<A:DocumentType>PDF</A:DocumentType>
<B:Attachment>
<A:EmbeddedDocumentBinaryObject mimeCode="application/pdf">
*base64 encoded string*
</A:EmbeddedDocumentBinaryObject>
</B:Attachment>
</B:AdditionalDocumentReference>
</Invoice>
问题1:我不能假设根元素将被命名为“Invoice”。
要检索我使用的附件:
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList)xPath.evaluate("//AdditionalDocumentReference",
doc.getDocumentElement(), XPathConstants.NODESET);
这没有任何回报,我也尝试过:
.//AdditionalDocumentReference
和
//B:AdditionalDocumentReference
两者都不起作用,唯一有效的是:
//Invoice/AdditionalDocumentReference
但正如我上面所说,根元素的名称可能不同,所以不是一个选项。
从我的文档中获取ID时遇到同样的问题。我认为最简单的方法是使用:
//ID
我知道该ID标签的第一次出现是文档的ID,但是这也没有返回任何内容。 它只在我使用时才有效:
//Invoice/ID
现在真的奇怪的部分。看到订单参考标签?我用这个单行:
xPath.evaluate("//OrderReference/ID", document)
它有效......
我做错了什么?