DOCX4J XML如何获取JAXBNodes的“价值”

时间:2017-05-12 12:39:44

标签: java xml jaxb docx4j

我想在docx文件中绑定一些XML变量(我的var在那个模式$ varname $中)。所以我使用一个函数返回一个List<Object>,其结果是我对文档的搜索。

String xpath = "//w:r[w:t[starts-with(text(), '$')]]";
List<Object> list = this.getDocumentPart().getJAXBNodesViaXPath(xpath, false);
if(!list.isEmpty()){
    for(int i = 0; i < list.size(); ++i){
            System.out.println(list.get(i).getClass());
    }
}

印刷的结果是:

  

class org.docx4j.wml.R
  class org.docx4j.wml.R
  class org.docx4j.wml.R

但是现在我想得到“值”即$ varname $来将它与地图进行比较(关键是每个变量的名称)?

2 个答案:

答案 0 :(得分:0)

您的XML可能是以下形式:

<w:r>
    <w:t>$varname$</w:t>
</w:r>

但不一定。还可能有其他内容,因此其内容模型是一个列表。

如果您只想将$ varname $替换为其他纯文本,那么您最好使用:

String xpath = "//w:t[starts-with(text(), '$')]";

因为那将返回文本对象;然后你得到他们当前的值,然后将其设置为其他值。

您目前拥有它的方式,您需要获取R的内容列表(首先将对象转换为R),并检查每个项目以查看它是否包含您的$ varname $。

答案 1 :(得分:0)

我找到解决方案:

if(!list.isEmpty()){
    List<Object> listObjNode;
    for(int i = 0; i < list.size(); ++i){
        List<Object> r = ((R)list.get(i)).getContent();
        for(int j = 0; j < r.size(); ++j){
            javax.xml.bind.JAXBElement jaxb = (javax.xml.bind.JAXBElement)r.get(j);
            org.docx4j.wml.Text t = (org.docx4j.wml.Text)jaxb.getValue();
            System.out.println(t);
        }
    }
}