0

我使用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...>
   }
}       
4

1 回答 1

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
    ...
}
于 2012-07-10T12:11:32.643 回答