我使用 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);
}
在上面的 for 循环的一次传递中,这将读取为第一段 -
“团队通过对任务、测试、管理和一般服务网络和系统具有直接的 MDA 经验,对需求有深入的了解。建立一个低风险、 react 灵敏的团队对任务、流程和系统有深入了解的好处是优先事项。我们使用基于“集成”
但是缺少该段落的最后部分。这将在连续的传递中出现。我在这里做错了什么。
该段落的全部内容是:
团队拥有任务、测试、管理和一般服务网络和系统的直接 MDA 经验,对需求有深入的了解。这样做的好处是建立一个低风险、 react 灵敏的团队,对使命、流程和优先事项有深入的了解。我们使用基于集成信息技术的基于角色的管理 (RBA) 方法,与联营承包商、现有流程和补充流程协同工作。
我不知道是否有办法获取整个段落,但如果有的话那就太好了,因为我需要逐段进行字符串替换。
最佳答案
我将我的评论扩展为答案:
我猜,该段落包含多个文本元素 (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);
}
<小时/>
使用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);
}
关于xpath - 我正在使用 docx4j 来读取 .docx 文件,我需要获取文档的段落并替换字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13199900/