如果您使用 XPath,则需要考虑命名空间。
使用 XPathQuery 示例,您可以提供它:
String xpath = "//w:fldChar[./w:ffData/w:checkBox]";
(或变体,取决于您要选择这三个节点中的哪一个)
另一种方法是遍历文档,其中有 TraversalUtils。
这两种方法都在 docx4j 的入门文档中进行了说明。
如上所述,如果您修改了对象,则不能依赖 Sun/Oracle JAXB XPath。
因此,手动遍历通常会更好。
这是一个如何做到这一点的例子。
package org.docx4j.samples;
import java.util.ArrayList;
import java.util.List;
import org.docx4j.TraversalUtil;
import org.docx4j.XmlUtils;
import org.docx4j.TraversalUtil.CallbackImpl;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.FldChar;
public class TraverseFind {
/**
* Example of how to find an object in document.xml
* via traversal (as opposed to XPath)
*
*/
public static void main(String[] args) throws Exception {
String inputfilepath = System.getProperty("user.dir") + "/checkbox.docx";
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath));
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
Finder finder = new Finder(FldChar.class);
new TraversalUtil(documentPart.getContent(), finder);
System.out.println("got " + finder.results.size() + " of type " + finder.typeToFind.getName() );
for (Object o : finder.results) {
Object o2 = XmlUtils.unwrap(o);
// this is ok, provided the results of the Callback
// won't be marshalled
if (o2 instanceof org.docx4j.wml.Text) {
org.docx4j.wml.Text txt = (org.docx4j.wml.Text)o2;
System.out.println( txt.getValue() );
} else {
System.out.println( XmlUtils.marshaltoString(o, true, true));
}
}
}
public static class Finder extends CallbackImpl {
protected Class<?> typeToFind;
protected Finder(Class<?> typeToFind) {
this.typeToFind = typeToFind;
}
public List<Object> results = new ArrayList<Object>();
@Override
public List<Object> apply(Object o) {
// Adapt as required
if (o.getClass().equals(typeToFind)) {
results.add(o);
}
return null;
}
}
}
按照我完成这些示例的方式,它们都为您提供了 org.docx4j.wml.FldChar 对象。
从那里,您将在 getFfData().getNameOrEnabledOrCalcOnExit() 中找到您的 CTFFCheckBox
如果您想要的只是复选框,那么您可以调整任一示例来获取它。那会更简单。