1

不幸的是,我对 docx4j 相当陌生,我正在尝试弄清楚如何检查我拥有的模板中的复选框。我尝试使用 Xpaths 并以这种方式获取节点,但我不确定我是否做对了,即使我设法获得正确的节点我也不太确定如何正确更改值,替换我设法弄清楚但我没有的文本想出改变一个属性值呢。

检查 document.xml 我找到了 Checkbox 的名称及其具有的属性

<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>

我尝试了 Xpaths 的不同 premutations,例如: //ffData[@name='Kontrollkästchen1']/checkBox

这会找到我想要的节点吗?如果没有,我怎样才能获取节点并正确更改属性?

谢谢马格纳斯

4

1 回答 1

2

如果您使用 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

如果您想要的只是复选框,那么您可以调整任一示例来获取它。那会更简单。

于 2013-04-03T01:54:43.233 回答