如何在java中漂亮地打印格式良好的无效XML片段?
我试过了如何在java中漂亮地打印格式良好的无效XML片段?,java,xml,sax,Java,Xml,Sax,我试过了 SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(false); factory.setValidating(false); XMLReader reader = factory.newSAXParser().getXMLReader(); Source xmlInput = new SAXSource(reader, new InputSource(new Stri
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();
但只要有一个“可忽略的空间”,缩进就停止了。我搜索了很多,但除了在处理程序中,在sax解析器中没有找到任何关于可忽略空格的内容。因此,我尝试添加我的处理程序:
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>
foo
格式正确但无效(n未定义)。我希望函数输出如下内容:
<n:a>
<b>foo </b>
</n:a>
福
如果我提供以下信息,则上述程序会输出:
<n:a><b>foo </b></n:a>
foo
但是对于
foo
我不认为未声明的名称空间有什么区别,而额外的空白空间会有什么区别。
我尝试了你的代码,我仍然在试图理解为什么,如果你添加这一行
transformer.setOutputProperty(OutputKeys.METHOD, "html");
您应该具有所需的输出。您能确认这一点并检查是否有任何最终的副作用吗?显示样本输入、输出、,我已经编写了一个漂亮的打印机libs,它本机支持现有的空白:没有声明名称空间没有任何直接的区别,但这意味着我不能使用DocumentBuilderFactorys的setIgnoringElementContentWhitespace方法,因为它假设验证已打开。无论如何,我更愿意在这里使用SAX:不需要构建中间表示。在一秒钟内尝试您的建议。因此它确实有效,但不适用于
。我想这是因为a
和b
是有效的HTML标记。我怀疑它不是这样工作的,因为它隐式地设置了DTD,文档似乎表明当存在DTD时,忽略了可忽略的空间。我想我需要启用验证。所以,如果我设置了一个空的DTD…也许不是,HTML是另一种输出方法。是的,当然,当你试图解析为xml时,没有声明的名称空间会有很大的不同。我的意思是,对于您的实际代码,无论是否使用有效的xml,结果都是一样的。html输出方法与其说它是一个真正的解决方案,不如说它是一个黑客,如果你认为它没有用,我将删除我的答案。是的,它是有用的,但正如你所说,它是一个黑客。这是迄今为止最有用的答案。