Java 使用StAX从一个XML文档读取DTD并写入另一个XML文档
因此,我正在使用StAX对一系列XML文档进行数据清理。我想基本上读入文档,然后吐出完全相同的文档,但缺少一些标记。我遇到的问题是,我没有输出有效的XML 您可以在左侧看到我的输出,在右侧看到原始文档[此处]()。底部的图像也是xmllint-valid的输出。正如您所看到的,它说,没有找到DTD,文档末尾有额外的内容 我实现编写器的代码如下Java 使用StAX从一个XML文档读取DTD并写入另一个XML文档,java,xml,stax,dtd,dtd-parsing,Java,Xml,Stax,Dtd,Dtd Parsing,因此,我正在使用StAX对一系列XML文档进行数据清理。我想基本上读入文档,然后吐出完全相同的文档,但缺少一些标记。我遇到的问题是,我没有输出有效的XML 您可以在左侧看到我的输出,在右侧看到原始文档[此处]()。底部的图像也是xmllint-valid的输出。正如您所看到的,它说,没有找到DTD,文档末尾有额外的内容 我实现编写器的代码如下 public XMLEventWriter setUpWriter(File blah) throws FileNotFoundException,
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;
}
现在我们已经解决了这个问题,我的问题有两个:
1) 我的输出是否因为缺少DTD而无效
1a)如果是,如何包括DTD?即使没有告诉我,这一直困扰着我
2) 如果它不是DTD,那么我该如何使它有效呢
谢谢你的帮助
1) 我的输出是否因为缺少DTD而无效
简短回答:理论上,可能是,也可能不是;实际上,是的
因此,在XML规范中,有效性是:
如果XML文档具有关联的文档类型声明,并且文档符合其中表示的约束,则该文档是有效的
一些读者认为这意味着文档在DTD中是有效的,当且仅当文档遵守DTD中的约束时。从这个意义上说,没有文档类型声明的文档可以对某些指定的DTD有效,具有文档类型声明的文档可以对其文档类型声明中指定的DTD或任何其他指定的DTD有效。或无效,视情况而定
其他读者认为此定义意味着除非文档具有文档类型声明,否则文档不可能有效(至少在严格意义上是有效的),并且有效性问题仅对文档的文档类型声明指定的文档类型定义有意义
实际上,除非您告诉验证解析器在哪里找到要验证的DTD,否则解析器别无选择,只能选择第二个更严格的视图。如果找不到DTD,它如何验证文档?(一些验证解析器接受指向DTD的运行时参数,而另一些则不接受。)
1a)如果是,如何包括DTD?即使没有告诉我,这一直困扰着我
从StAX参考实现来看,似乎writedd(string)
是您的朋友
2) 如果它不是DTD,那么我该如何使它有效呢
如果您收到一条关于“exta内容”的消息,那么您的输出可能不仅无效,而且格式不好。先检查并修复它
“额外内容”错误消息的可能原因是您过早地关闭了根元素,或者根本没有根元素
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();