Я разбираю документ, который я не могу изменить из Интернета с помощью SAX Parser. Он работал очень хорошо, когда документы пришли отформатированы как таковые:Анализ XML без начала и конца документа
<outtertag>
<innertag>data</innertag>
<innerag>moreData</innertag>
</outtertag>
Однако, есть определенные вызовы я делаю, когда XML отформатирован без внешних тегов, так что я в основном получить только список данных, как например :
<innertag>data</innertag>
<innerag>moreData</innertag>
Это кажется глупым, но я не получаю, чтобы выбрать способ форматирования XML и не может быть изменен на данный момент. Проблема заключается в том, что кажется, что SAX Parser попадает в событие endDocument, как только он попадает в первый закрывающий innertag.
У меня есть довольно хакерское решение для преобразования InputStream в String, метания тегов вокруг него и последующее преобразование его в InputStream. На самом деле он отлично разбирается. Но, конечно, есть лучший способ. Я бы предпочел не писать целый парсер. Большинство тегов одинаковы в стороне от отсутствия открывающих и закрывающих тегов.
Просто для этого я отправлю код, но это довольно стандартный SAX Parser. Оригинал фактически разбор около 30 некоторых тегов:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
XMLReader xmlReader = saxParser.getXMLReader();
MyHandler handler = new MyHandler();
xmlReader.setContentHandler(handler);
InputSource inputSource = new InputSource(url.openStream());
xmlReader.parse(inputSource);
}
catch (SAXException e) { e.printStackTrace(); }
catch (ParserConfigurationException e) { e.printStackTrace(); }
catch(Exception e) { e.printStackTrace(); }
}
private class MyHandler extends DefaultHandler {
private StringBuilder content;
public MyHandler() {
content = new StringBuilder();
}
public void startElement(String uri, String localName, String qName,
Attributes atts) throws SAXException {
content = new StringBuilder();
if(localName.equalsIgnoreCase("innertag")) {
//Doing stuff
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
//Doing stuff
}
public void characters(char[] ch, int start, int length)
throws SAXException {
content.append(ch, start, length);
}
public void endDocument() throws SAXException {
//When parsing the second type of document, hits this event almost immediately after parsing first tag
}
}
И, если это имеет значение, вот мой Hacky код, я использую, но просто чувствует себя неправильно, но это работает:
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
StringBuilder sb = new StringBuilder("<tag>");
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
sb.append("</tag>");
String xml =sb.toString();
InputStream is = new ByteArrayInputStream(xml.getBytes());
InputSource source = new InputSource(is);
xmlReader.parse(source);
Технически, если он не соответствует стандарту XML, то это действительно не XML. Таким образом, речь идет не о невозможности выбора формата, а в том, что вы не получаете XML-файл, а просто что-то похожее на XML, поэтому анализатор не может его обработать. – psubsee2003
Любые идеи по анализу второго набора данных, отличных от XML? – s3kt0r
Я не очень разбираюсь в Java, поэтому я не уверен, есть ли какое-то конкретное решение, но при работе с подобными ситуациями на других языках я сделал именно то, что вы делаете. – psubsee2003