以流方式从Java解析XML的更通用方法?

时间:2011-01-20 21:50:20

标签: java xml parsing stream stax

我需要有效地解析可能非常大的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 个答案:

答案 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有关,这就是你选择编写代码的方式。

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