0

我有两个文件:

  1. 文件 1(输入)
  2. 文件 2(输出)

文档 2 是通过转换过程传递文档 1 的结果,该过程使任何内容和格式保持不变(通过 Word 中的并排比较验证)。

但是,该过程会从 .docx 文件中删除许多 ID 号。

例如,

      <w:pw:rsidP="00B600D6" w:rsidR="00F55D78" w:rsidRDefault="00B600D6">

变成

      <w:p>

通过以下代码根据每个文档的转储:

正文 = ((Document)newerPackage.getMainDocumentPart().getJaxbElement()).getBody();
节点 node = org.docx4j.XmlUtils.marshaltoW3CDomDocument(body).getDocumentElement();
TransformerFactory tf = TransformerFactory.newInstance();
变压器变压器 = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "是");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(新 DOMSource(节点),
             新的 StreamResult(新的 OutputStreamWriter(System.out, "UTF-8")));

使用此处推荐的 docx4j Differencer 比较方法,所有内容(除了没有应用格式的第一行)都显示为修改。

问题是:差异是由于缺少 id、格式还是其他原因造成的?

如果它很重要,我们在这种情况下使用 docx4j 对我们的往返过程执行自动健全性/回归测试(即应用“无损”过程并期望没有差异)

4

1 回答 1

0

披露:我在 docx4j 上工作

如果段落之间的唯一区别是 rsid 属性,它们仍将被检测为不同。

您可以在执行比较之前“清理”文档,这样 docx 都没有 rsid 属性。请参阅过滤器示例

顺便说一句,查看对象(例如,单个段落或整个正文)的 XML 的更简单方法是使用 XmlUtils.marshaltoString

于 2012-07-11T12:48:50.427 回答