0

我需要有效地解析可能非常大的 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...
    }

我正在寻找一种方法来做到这一点,而不会将解析器与要解析的东西紧密耦合,此外,这段代码感觉不对。看起来这应该更真正面向事件。

有什么建议吗?

4

4 回答 4

2

SAX 的事件完全符合您的想法。.. :) http://www.saxproject.org/quickstart.html显示了一个简单的代码库。我错过了什么吗?

于 2011-01-20T22:00:37.023 回答
2

如果您正在寻找一种在流模式下处理 XML 的高级语言,并且如果您不介意处于最前沿,请考虑 Saxon-EE 9.3 XSLT 中的流工具 - XSLT 3.0 草案的部分实现规格。

http://www.saxonica.com/documentation/sourcedocs/streaming.xml

于 2011-01-20T23:25:16.483 回答
1

这可以写成通用的。例如,我有一个属性文件,其中包含 xml 元素名称和类字段名称/哈希映射键名称之间的映射。

if (event.isStartElement()) {
 if  (event.asStartElement().getName().getLocalPart().equals(XMLElementName)) {

    event = eventReader.nextEvent();
    fields.put(classFieldName, event.asCharacters().getData());
        continue;
 }
}

这有助于我们拥有一个解析器来解析不同的 xml 消息。这只是一个想法..我们可以做更多..

于 2012-01-04T19:13:51.247 回答
0

我认为您的代码的紧密耦合性质与 StAX 没有任何关系,这只是您选择编写它的方式。

您可以轻松地重构该代码以将事件处理委托给处理程序对象,例如,使用查找表将元素名称分配给处理程序对象。这种机制可能是完全通用的和可重用的。

于 2011-01-20T23:30:43.930 回答