[英]Use StAX to read DTD from one XML doc and write to another
因此,我正在使用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();
现在我们已经解决了这个问题,我的问题是双重的:
1)由于缺少DTD,我的输出是否无效?
1a)如果是,我如何包括DTD? 即使不告诉我,这一直困扰着我
2)如果它不是DTD,那么我该怎么做才有效。
谢谢你的帮助!!
1)由于缺少DTD,我的输出是否无效?
简短的回答:从理论上讲,也许是,也许不是。 实际上,是的。
在XML规范中,有效性定义如下:
如果XML文档具有关联的文档类型声明,并且该文档符合其中表示的约束,则该XML文档是有效的。
一些读者认为,这意味着并且仅当该文件遵守DTD中的约束条件时,该文件才对DTD有效。 从这种意义上说,没有文档类型声明的文档可以对某些指定的DTD有效,而具有文档类型声明的文档可以对文档类型声明中指定的DTD或任何其他指定的DTD有效。 还是无效(视情况而定)。
其他读者认为此定义意味着,除非具有文档类型声明,否则文档是无效的(至少在严格意义上来说),并且有效性问题仅对文档的文档定义的文档类型定义有意义。文档类型声明。
实际上,除非您告诉验证解析器在哪里可以找到要验证的DTD,否则解析器别无选择,只能采取第二种限制性更强的视图。 如果找不到DTD,如何验证文档? (某些验证解析器接受用于指向DTD的运行时参数,其他则不接受。)
1a)如果是,我如何包括DTD? 即使不告诉我,这一直困扰着我
从用于StAX参考实现的JavaDocs中,似乎writeDTD(string)
是您的朋友。
2)如果它不是DTD,那么我该怎么做才有效。
如果您收到有关“外部内容”的消息,则您的输出似乎不仅无效而且格式不正确。 首先检查并修复。
出现“额外内容”错误消息的可能原因是您过早关闭了根元素,或者根本没有根元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.