Как я могу красиво распечатать правильно сформированный неверный фрагмент XML в Java? - PullRequest
0 голосов
/ 21 ноября 2011

Я пробовал

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

, но как только появляется "игнорируемое пространство", отступ останавливается.Я много искал, но ничего не нашел о игнорируемых пробелах в синтаксических анализаторах, кроме как в Handlers.Поэтому я попытался добавить свой обработчик:

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>.

1 Ответ

1 голос
/ 21 ноября 2011

Я не думаю, что пространство имен, не объявленное, не имеет никакого значения, в то время как дополнительные пробелы делают.Я попробовал ваш код и до сих пор пытаюсь понять, почему, если вы добавите эту строку

transformer.setOutputProperty(OutputKeys.METHOD, "html");

, вы получите желаемый результат.Не могли бы вы подтвердить это и проверить возможные побочные эффекты?

...