Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中漂亮地打印格式良好的无效XML片段?_Java_Xml_Sax - Fatal编程技术网

如何在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输出方法与其说它是一个真正的解决方案,不如说它是一个黑客,如果你认为它没有用,我将删除我的答案。是的,它是有用的,但正如你所说,它是一个黑客。这是迄今为止最有用的答案。