【问题标题】:More generic way to parse XML from Java in a streaming fashion?以流方式从 Java 解析 XML 的更通用方法?
【发布时间】:2011-01-20 21:50:19
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

    标签: java xml parsing stream stax


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        if (event.isStartElement()) {
         if  (event.asStartElement().getName().getLocalPart().equals(XMLElementName)) {
        
            event = eventReader.nextEvent();
            fields.put(classFieldName, event.asCharacters().getData());
                continue;
         }
        }
        

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 我认为他的观点是,如果可以编写“通用且可重用”的 xml 解析代码,为什么不在一个不错的库/框架中呢?他的“坏代码”是你在互联网上看到的,很可能来自所谓的最佳实践的例子。通过案例陈述手动解析 XML(或手动滚动基于事件的解决方案)真的看起来像我们在 2011 年应该做的事情吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-25
          • 2021-12-21
          • 2021-01-07
          • 1970-01-01
          • 1970-01-01
          • 2010-12-15
          相关资源
          最近更新 更多