我试过
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
XMLReader reader = factory.newSAXParser().getXMLReader();
Source xmlInput = new SAXSource(reader, new InputSource(new StringReader(xml)));
StringWriter stringWriter = new StringWriter();
xmlPretty = new StreamResult(stringWriter);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(xmlInput, xmlPretty);
return xmlPretty.getWriter().toString();
但是只要有“可忽略的空间”,压痕就会停止。我已经搜索了很多但没有发现萨克斯解析器中可忽略的空格,除了处理程序。所以我试图添加一个我的处理程序:
class MyHandler extends DefaultHandler {
@Override
public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
System.out.println("foo");
}
}
...
reader.setContentHandler(new MyHandler());
但它从不打印“foo”。
更新: 以下是输入示例:
<n:a> <b>foo </b> </n:a>
结构良好但无效(n未定义)。我希望函数输出如下内容:
<n:a>
<b>foo </b>
</n:a>
如果我提供的话,上面的程序会输出:
<n:a><b>foo </b></n:a>
但不是<n:a> <b>foo </b> </n:a>
。
答案 0 :(得分:1)
我认为未声明的命名空间没有任何区别,而额外的空格确实如此。 我尝试了你的代码,我仍然试图理解为什么,如果你添加这一行
transformer.setOutputProperty(OutputKeys.METHOD, "html");
你应该有所需的输出。你能证实这一点并检查是否有任何副作用吗?