删除XML字符元素中的重复换行符/制表符/空格

Dmi*_*ich 6 java xml parsing sax

<node> test
    test
    test
</node>
Run Code Online (Sandbox Code Playgroud)

我希望我的XML解析器读取字符<node>和:

  1. 将换行符和制表符替换为空格并将多个空格合并为一个空格.结果,文本看起来应该类似于"测试测试".
  2. 如果节点包含XML编码字符:tabs(&#x9;),newlines(&#xA;)或whitespaces(&#20;) - 它们应该被保留.

我正在尝试下面的代码,但它保留了重复的空白.

  dbf = DocumentBuilderFactory.newInstance();
  dbf.setIgnoringComments( true );
  dbf.setNamespaceAware( namespaceAware );
  db = dbf.newDocumentBuilder();
  doc = db.parse( inputStream );
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做我想要的吗?

谢谢!

McD*_*ell 1

第一部分 - 替换多个空格 - 相对容易,尽管我不认为解析器会为你做这件事:

InputSource stream = new InputSource(inputStream);
XPath xpath = XPathFactory.newInstance().newXPath();
Document doc = (Document) xpath.evaluate("/", stream, XPathConstants.NODE);

NodeList nodes = (NodeList) xpath.evaluate("//text()", doc,
    XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
  Text text = (Text) nodes.item(i);
  text.setTextContent(text.getTextContent().replaceAll("\\s{2,}", " "));
}

// check results
TransformerFactory.newInstance()
    .newTransformer()
    .transform(new DOMSource(doc), new StreamResult(System.out));
Run Code Online (Sandbox Code Playgroud)

这是最难的部分:

如果节点包含 XML 编码字符:制表符 ( &#x9;)、换行符 ( &#xA;) 或空格 ( &#20;) - 应保留它们。

解析器总是会"&#x9;"变成"\t"- 您可能需要编写自己的 XML 解析器。

据撒克逊人的作者说:

我不认为任何 XML 解析器都会向应用程序报告数字字符引用——它们总是会被扩展。实际上,您的应用程序不应该关心这一点,就像关心属性之间有多少空白一样。