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)方法与合作承包商,现有流程和补充流程的增加协同工作.
我不知道是否有办法获得整个段落,但是如果有的话会很好,因为我需要逐段更换字符串.
我将评论扩展到答案:
我想,该段落包含多个文本元素(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)