繁体   English   中英

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

[英]More generic way to parse XML from Java in a streaming fashion?

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

我正在寻找一种方法,而不将解析器与要解析的内容紧密耦合,此外,此代码感觉不对。 看来这应该更真正地面向事件。

有什么建议吗?

SAX的事件可以完全按照您的想法执行。.:) http://www.saxproject.org/quickstart.html演示了一个简单的代码库。 我想念什么吗?

如果您正在寻找用于以流模式处理XML的高级语言,并且不介意处于最新状态,请考虑Saxon-EE 9.3 XSLT中的流功能-XSLT 3.0草案的部分实现规格。

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

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

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

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

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

我认为代码的紧密耦合本质与StAX无关,这只是您选择编写代码的方式。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM