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

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));

这是困难的部分:

如果节点包含XML编码字符:标签( ),换行符( )或空格() - 它们应该保留。

解析器将始终将" "转换为"\t" - 您可能需要编写自己的XML解析器。

According to的作者{p {3}}:

我认为任何XML解析器都不会报告应用程序的数字字符引用 - 它们将始终展开。实际上,您的应用程序不应该关心这一点,而不是关心属性之间有多少空格。