我使用docx4j来读取.docx文件,我需要获取文档的段落并替换字符串

yam*_*ams 2 xpath ms-word jaxb docx4j

我使用docx4j来读取和解析.docx文件,但是当我遍历段落时,它会在一次传递中读取而不是所有段落.下面是我正在使用的代码示例.

private void replaceAcrAndDef(String acrName, String acrParensName, String oldDef, String newDef){
    String XPATH_TO_SELECT_TEXT_NODES = "//w:t";
    List<Object> paragraphs = template.getMainDocumentPart().getJAXBNodesViaXPath(XPATH_TO_SELECT_TEXT_NODES, true);
    for (Object obj : paragraphs){
        Text text = (Text) ((JAXBElement)obj).getValue();
        String textValue = text.getValue();
        System.out.println(textValue);
 }
Run Code Online (Sandbox Code Playgroud)

在上面的for循环的一次传递期间,这将作为第一段读取 -

"团队通过为任务,测试和管理以及一般服务网络和系统提供直接的MDA经验,对这些要求有深刻的理解.通过对任务,流程和优先级的既定理解,培养低风险,反应灵敏的团队的好处.使用基于综合的"

但它缺少该段的最后部分.这将在连续的传球中出现.我在这做错了什么.

该段的全部内容如下:

团队通过为任务,测试和管理以及一般服务网络和系统提供直接的MDA经验,对需求有深刻的理解.低风险,反应迅速的团队的好处是对任务,流程和优先事项有着深刻的理解.我们使用基于角色的综合信息技术(RBA)方法与合作承包商,现有流程和补充流程的增加协同工作.

我不知道是否有办法获得整个段落,但是如果有的话会很好,因为我需要逐段更换字符串.

Edd*_*ian 5

我将评论扩展到答案:

我想,该段落包含多个文本元素(w:t).你能提供这个问题的样本文件吗?如何在段落元素上使用TextUtils.extractText提取文本呢?

试试P.toString().引用了TextUtils,您也可以尝试使用StringWriter.


使用P.toString():

// Request paragraphs
final String XPATH_TO_SELECT_TEXT_NODES = "//w:p";
final List<Object> jaxbNodes = wordMLPackage.getMainDocumentPart().getJAXBNodesViaXPath(XPATH_TO_SELECT_TEXT_NODES, true);

for (Object jaxbNode : jaxbNodes){
    final String paragraphString = jaxbNode.toString();
    System.out.println(paragraphString);
}
Run Code Online (Sandbox Code Playgroud)

使用TextUtils.extractText(...)StringWriter:

for (Object jaxbNode : jaxbNodes){
    final StringWriter stringWriter = new StringWriter();
    TextUtils.extractText(jaxbNode, stringWriter);
    final String paragraphString = stringWriter.toString();
    System.out.println(paragraphString);
}
Run Code Online (Sandbox Code Playgroud)