如何使用docx4j获取主文档部分中的实际Hyperlink元素

时间:2016-08-04 20:01:59

标签: xpath docx4j

所以我有一个案例,我需要能够处理docx主体内部的实际Hyperlink元素,而不仅仅是目标URL或链接的内部/外部性。

作为一个可能的额外皱纹,这个超链接在打开时不会出现在docx中,而是由docx4j-xhtmlImporter添加。

我在这里迭代了关系列表:wordMLPackage.getMainDocumentPart().getRelationshipsPart().getRelationships().getRelationship()

找到我想要的超链接的关系ID。我尝试使用XPath查询:List<Object> results = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath("//w:hyperlink[@r:id='rId11']", false); 但清单是空的。我还认为它可能需要刷新,因为我在运行时添加了超链接,所以我尝试将refreshXMLFirst参数设置为true。关于它不是真正的节点,因为它是P的内部类,我也尝试getJAXBAssociationsForXPath具有与上面相同的参数,并且不会返回任何东西。

此外,即使像"//w:hyperlink"这样的XPath也无法匹配任何内容。

如果我在保存到文件后将其解压缩,我可以看到XML中的超链接,因此我知道ID是正确的:<w:hyperlink r:id="rId11">

XPath是找到这个的正确方法吗?如果是的话,我做错了什么?如果不是,我该怎么办?

由于

2 个答案:

答案 0 :(得分:0)

尝试不使用命名空间绑定

List<Object> results = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath("//*:hyperlink[@*:id='rId11']", false);

答案 1 :(得分:0)

XPathHyperlinkTest.java是一个适合我的简单测试用例

您可能因为JAXB而遇到问题,或者可能是因为在您的情况下设置活页夹的具体方式(您首先打开现有的docx,还是创建一个新的?)。您使用的是哪个docx4j版本?

您使用的是哪种JAXB实现?如果它是Sun / Oracle实现(参考实现,或JDK / JRE中包含的实现),则可能是导致问题的原因,在这种情况下,您可能会尝试使用MOXy。

使用XPath的另一种方法是遍历docx;见finders/ClassFinder.java