そのため、StAX を使用して一連の XML ドキュメントに対してデータ クリーニングを行っています。私は基本的にドキュメントを読み込んで、いくつかのタグが欠落しているまったく同じドキュメントを吐き出したいと思っています。私が抱えている問題は、有効な 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();
邪魔にならないようになったので、私の質問は2つあります。
1) DTD がないため、私の出力は有効ではありませんか?
1a) はいの場合、DTD を含めるにはどうすればよいですか? いや言われてもずっと悩んでた
2)DTDではない場合、どうすればこのことを有効にできますか。
ご協力いただきありがとうございます!!