林不幸的是相当新的docx4j,我试图找出如何,我有一个模板中选中一个复选框。 我试着用XPath的工作和取得的节点这种方式,但林不知道我这样做是正确,也就算我管理得到正确的节点我不是很清楚如何正确地更改值,替换文字我设法弄清楚,但我还没有想通了更改属性值呢。
检查document.xml中,我发现的复选框,它具有属性的名称
<w:fldChar w:fldCharType="begin">
<w:ffData><w:name w:val="Kontrollkästchen1"/>
<w:enabled/>
<w:calcOnExit w:val="0"/>
<w:checkBox>
<w:sizeAuto/>
<w:default w:val="0"/>
</w:checkBox>
我试图的XPath的不同势前突变,例如:// ffData [@名称=“Kontrollkästchen1”] /复选框
这会找到我想要的节点? 如果没有,我怎么能拿节点和正确更改属性?
谢谢马格努斯
如果您使用的XPath,你需要采取的命名空间考虑在内。
使用给XPathQuery样品,你可以给它:
String xpath = "//w:fldChar[./w:ffData/w:checkBox]";
(或变化,这取决于你想要选择的这三个节点)
另一种方法是遍历文档,对于其存在TraversalUtils。
这两种方法都在docx4j的入门文档解释。
正如指出的还有,太阳/ 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()你CTFFCheckBox。getNameOrEnabledOrCalcOnExit()
如果你想要的是复选框,然后就可以适应任何例子只是获取。 这将是简单的。