StreamingPathFilter修剪空格

时间:2012-07-05 13:11:55

标签: java xml-parsing xom

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

1 个答案:

答案 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
    ...
}