【发布时间】:2016-11-24 15:46:27
【问题描述】:
我有一个简单的 XML 文件和一个代表它的简单 DTD。
我正在处理 假设,即使用 DTD 验证标记是可行的(与我相信的实际模式相反)是最强大和最合适的选项)。
基于这个假设,我想我会尝试使用 StaX。
问题
即使提供了有效的 DTD,StaX 似乎也不会验证任何内容,并且 XML 文件与 DTD 中定义的架构不匹配。
我希望下面的代码会因一些与验证相关的堆栈跟踪而失败,而不是在我的 foo.xml 文件中打印所有元素名称。
我认为我的假设可能存在很大问题,但在我浏览的相关 SO 问题中或其他在线文献中找不到任何具体解释。
下面的代码和资源。
foo.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT foo (bar+) >
<!ATTLIST foo
foo CDATA #REQUIRED
>
<!ELEMENT bar (#PCDATA) >
<!ATTLIST bar
bar (bar|blah) #REQUIRED
>
foo.xml
<?xml version="1.0" encoding="UTF-8"?>
<foo foo="foo">
<!-- attribute "blah" invalid -->
<bar bar="bar" blah="blah">bar</bar>
<!-- invalid -->
<bar />
</foo>
代码
XMLInputFactory xif = XMLInputFactory.newFactory();
// not sure if this is required? doens't seem to help
xif.setProperty(XMLInputFactory.IS_VALIDATING, "true");
// adding dtd
xif.setXMLResolver(
new XMLResolver() {
public Object resolveEntity(String publicID, String systemID, String baseURI, String namespace) throws XMLStreamException {
if ("foo.dtd".equals(systemID)) {
return Main.class.getResourceAsStream("foo.dtd");
}
else {
return null;
}
};
}
);
XMLStreamReader reader = null;
try {
reader = xif.createXMLStreamReader(Main.class.getResourceAsStream("foo.xml"));
while (reader.hasNext()) {
switch (reader.next()) {
// prints local name just for testing
// - expecting this to fail at some point
case XMLStreamReader.START_ELEMENT:
System.out.println(reader.getLocalName());
}
}
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (Exception e) {}
}
}
输出(期待一些堆栈跟踪)
foo
bar
bar
【问题讨论】: