我需要有效地解析可能非常大的XML文件(因此无法将整个文件放在内存中)。因此,我研究了像XMLStreamReader这样的流技术,但是这些技术看起来非常低级并且产生了非常硬编码的代码:
event = parser.next();
switch (event)
{
case XMLStreamConstants.START_ELEMENT:
elementName = parser.getLocalName();
if (elementName.equals("name")){
state = FOUND_A_NAME;
}else if (elementName.equals("address")){
state = FOUND_AN_ADDRESS;
}
ETC...
}
我正在寻找一种方法来实现这一点,而不必将解析器与要解析的东西紧密耦合,此外,这段代码感觉不对。看起来这应该更加真实地面向事件。
有什么建议吗?
答案 0 :(得分:2)
SAX的事件完全符合你的想法...... :) http://www.saxproject.org/quickstart.html显示了一个简单的代码库。我错过了什么吗?
答案 1 :(得分:2)
如果您正在寻找更高级别的语言来处理流模式下的XML,并且如果您不介意处于最前沿,请考虑Saxon-EE 9.3 XSLT中的流媒体工具 - 部分实现草案XSLT 3.0规范。
http://www.saxonica.com/documentation/sourcedocs/streaming.xml
答案 2 :(得分:1)
这可以写成通用的。例如,我有一个具有映射的属性文件 在xml元素名称和类字段名称/ hashmap键名称之间。
if (event.isStartElement()) {
if (event.asStartElement().getName().getLocalPart().equals(XMLElementName)) {
event = eventReader.nextEvent();
fields.put(classFieldName, event.asCharacters().getData());
continue;
}
}
这有助于我们使用一个解析器来解析不同的xml消息。这只是一个想法..我们可以做更多......
答案 3 :(得分:0)
我不认为代码的紧密耦合性与StAX有关,这就是你选择编写代码的方式。
您可以使用查询表(例如,元素名称到处理程序对象)轻松地重构该代码以将事件处理委托给处理程序对象。这种机制完全是通用的,可以重复使用。