gpt4 book ai didi

java - 我们如何使用 XMLEventReader 解析 DOCTYPE 信息?

转载 作者:数据小太阳 更新时间:2023-10-29 02:09:16 27 4
gpt4 key购买 nike

我有一些现有代码可以解析顶级元素命名空间以确定我们正在查看的 XML 文件类型。

XMLEventReader reader = createXMLEventReader(...);
try {
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
switch (event.getEventType()) {
case XMLStreamConstants.DTD:
// No particularly useful information here?
//((DTD) event).getDocumentTypeDeclaraion();
break;

case XMLStreamConstants.START_ELEMENT:
formatInfo.qName = ((StartElement) event).getName();
return formatInfo;

default:
break;
}
}
} finally {
reader.close();
}

如果我允许解析器从网络加载 DTD,getDocumentTypeDeclaraion()包含一个巨大的字符串,其中包含的信息比我知道的要多得多,因为它在传递之前将所有相关的 DTD 插入到字符串中。另一方面,如果我阻止解析器从 Web 加载 DTD(出于显而易见的原因,这无论如何都是可取的),它只会给我字符串 "<!DOCTYPE" .

有没有办法取回 DOCTYPE 中的值?

我正在使用 JRE 附带的默认解析器,以防万一。

最佳答案

我知道这是一篇旧帖子,但在找到为我指明正确方向的您的问题之前,我无法在网上找到答案。

这里通过打开 XMLEvent#getEventType() 给定的值来检索 DTD 的外部未解析实体。方法。

XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setXMLResolver(new XMLResolver() {
@Override
public Object resolveEntity(String publicID, String systemID,
String baseURI, String namespace) throws XMLStreamException {
//return a closed input stream if external entities are not needed
return new InputStream() {
@Override
public int read() throws IOException {
return -1;
}
};
}
});

XMLEventReader reader = factory.createXMLEventReader( . . . );
try {
while(reader.hasNext()) {
XMLEvent event = reader.nextEvent();
switch (event.getEventType()) {
case XMLStreamConstants.DTD:
List<EntityDeclaration> entities = ((DTD)event).getEntities();
if (entities != null) {
for (EntityDeclaration entity : entities)
System.out.println(entity.getName() + " = " + entity.getSystemId());
}
break;
case . . .
}
}
} finally {
reader.close();
}

关于java - 我们如何使用 XMLEventReader 解析 DOCTYPE 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7100934/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com