我使用XOM库来解析和处理.docx文档。 MS Word在段落标记(< w:p>)内的运行(< w:r>)中存储文本内容,并且经常将文本分成几个运行。有时它们之间的每个单词和每个空格都在一个单独的运行中。当我加载只包含空格的运行时,解析器会删除该空格并将其作为空标记处理,因此输出包含没有空格的文本。我怎么能强制解析器保留所有空格?我宁愿保留这个解析器,但是如果没有解决方案,你能推荐一个替代解决方案吗?
这就是我调用解析器的方式:
StreamingPathFilter filter = new StreamingPathFilter("/w:document/w:body/*:*", prefixes);
Builder builder = new Builder(filter.createNodeFactory(null, contentTransform));
builder.build(documentFile);
...
StreamingTransform contentTransform = new StreamingTransform() {
@Override
public Nodes transform(nu.xom.Element node){
<...process XML and output text...>
}
}
答案 0 :(得分:0)
与此同时,由于XOM邮件列表上的 Elliotte Rusty Harold 的提示,我找到了解决这个问题的方法。
首先,StreamingPathFilter
实际上不属于nu.xom
包,属于nux.xom
。
其次,问题是由StreamingPathFilter
引起的。当我更改代码以使用默认的Builder
构造函数时,输出中会出现缺少的空格。
仅用于文档,新代码如下所示:
Builder builder = new Builder();
nu.xom.Document doc = builder.build(documentFile);
context = XPathContext.makeNamespaceContext(doc.getRootElement());
Nodes nodes = doc.getRootElement().query("w:body/*", context);
for (int i = 0; i < nodes.size(); i++) {
transform((nu.xom.Element) nodes.get(i));
}
...
private void transform(nu.xom.Element node){
//process nodes
...
}