Итак, я выполняю некоторую очистку данных в серии XML-документов с использованием StAX. Я хочу, по сути, прочитать документ и выдать тот же самый документ с несколькими отсутствующими тегами. У меня проблема в том, что я не вывожу правильный XML.
Вы можете увидеть мой вывод слева и исходный документ справа [здесь] (http://imgur.com/a/oFxZd). Изображение внизу также является результатом xmllint -valid. Как видите, там написано, что DTD не найдено, а в конце документа есть дополнительный контент.
Мой код для реализации писателя таков
public XMLEventWriter setUpWriter(File blah) throws FileNotFoundException, XMLStreamException {
newFileName = thef.getName().substring(0, thef.getName().indexOf("_") + 1);
try {
writer = outputFactory
.createXMLEventWriter(new FileOutputStream(newFileName + "mush.xml"), "UTF-8");
} catch (XMLStreamException ex) {
ex.printStackTrace();
System.out.println("There was an XML Stream Exception, whatever that means for writer");
}
//outputFactory.setProperty("escapeCharacters", false);
eventFactory = XMLEventFactory.newInstance();
StartDocument startDocument = eventFactory.createStartDocument();
writer.add(startDocument);
//writer.add("<!DOCTYPE DjVuXML>");
return writer;
}
Это мой код, который обрабатывает фактическое письмо.
if (event.isStartElement()) { //first it looks for start elements
StartElement se = event.asStartElement();
if ("OBJECT".equals(se.getName().getLocalPart())) {
writer.add(se);
} else if ("MAP".equals(se.getName().getLocalPart())) {
writer.add(se);
} else if ("PARAM".equals(se.getName().getLocalPart())) {
writer.add(se);
} else if ("LINE".equals(se.getName().getLocalPart())) {
writer.add(se);
} else if ("DjVuXML".equals(se.getName().getLocalPart())) {
writer.add(se);
}else if ("WORD".equals(se.getName().getLocalPart())) {
word.text = reader.getElementText();
EndElement wordEnd = eventFactory.createEndElement("", "", "WORD");
writer.add(se);
Characters characters = eventFactory.createCharacters(word.text);
writer.add(characters);
writer.add(wordEnd);
}
}
} else if (event.isEndElement()) {
EndElement ee = event.asEndElement();
if ("MAP".equals(ee.getName().getLocalPart())) {
writer.add(ee);
} else if ("DjVuXML".equals(ee.getName().getLocalPart())) {
writer.add(ee);
} else if ("LINE".equals(ee.getName().getLocalPart())) {
writer.add(ee);
}
else if ("BODY".equals(ee.getName().getLocalPart())) {
writer.add(ee);
}
}
}
writer.flush();
writer.close();
Теперь, когда мы разобрались с этим, мой вопрос двоякий:
1) Является ли мой вывод недействительным, потому что в нем отсутствует DTD?
1a) если да, как включить DTD? Даже если нет, скажи мне, это меня беспокоит
2) Если это не DTD, то как, черт возьми, мне сделать эту вещь действительной.
Спасибо за вашу помощь!!