【问题标题】:Which parser: SAX, DOM or xpath?哪个解析器:SAX、DOM 还是 xpath?
【发布时间】:2012-07-30 09:40:44
【问题描述】:

我有 xml,我在其上运行查询,如下所述。哪个解析器(sax 或 DOM 或 xpath)最适合按 id 检索查询节点?

你能用一些示例代码解释一下吗?这样对我有很大帮助?

我想编写一个通用类,它通过 id 读取查询并将参数传递给它。由于每个查询都可能返回一组不同的值,所以在我们执行查询后返回值的最佳方式是什么?

<?xml version="1.0" encoding="UTF-8"?>
<queries>
    <query id="getUserByName">
        select * from users where name=?
    </query>
    <query id="getUserByEmail">
        select * from users where email=?
    </query>
</queries>

【问题讨论】:

  • 如果你想在xml中存储sql查询为什么不使用mybatis?您不必编写查询检索代码,您的 jdbc 代码将消失,并且您可以免费获得缓存等功能。

标签: java xml


【解决方案1】:

主要取决于用例。

一般来说,SAX Parser 适合解析大文件,dom parser 适合备用。

原因是dom parser 在解析大文件/输入流时最终占用了足够的内存。

在我看来,需要有一定的经验才能最好地利用 Sax Parser。相对而言,dom解析更容易学习和使用。

如果用例允许,Apaches commons-digester 也可以作为替代建议,这比 sax 更容易并且在内部使用 sax。

而且xpath 不是解析器。


对于您的情况,您不需要解析器。我认为您正在寻找使用xpath 检索sql 查询的xpath。

如果您需要为简单的xml 生成新的 xml,您可以手动执行。我现在无法提出更好的替代方案。

【讨论】:

  • 嗨!这个答案在 2019 年仍然是最新的吗?有新演员出现吗?
【解决方案2】:

按可用性和程序员生产力的顺序更好:SAX 最差,XPath 最好。

在节省机器周期方面更好:SAX 最好,XPath 最差。

因此,这取决于您的程序员是否比您的计算机花费更多。通常他们会这样做。

【讨论】:

    【解决方案3】:

    如果你真的把 SQL 放到 XML 中然后执行,我会使用 MyBatis。

    如果您不想使用 MyBatis,您应该使用 JAXB 并将整个 XML 加载为查询对象列表,因为您不想为每个查询重新解析 XML。让我向您展示 JAXB 是多么容易:

    @XmlRootElement(name = "queries")
    public class Queries {
      @XmlElement(name = "query")
      public List<Query> queries;
    }
    
    public Query {
      @XmlAttribute
      public String id;
      @XmlValue
      public String sql;
    }
    
    Queries queries = JAXB.unmarshal(file, Queries.class);
    

    以上内容未经测试,但应该能给你一个想法。

    【讨论】:

      【解决方案4】:

      从技术上讲,XPath 不是查询,而是a query language for selecting nodes from an XML document

      SaX 和 DOM 的主要区别在于 DOM 会将您的所有文档加载到内存结构中。对于小型 XML 文档,您不会遇到太多麻烦,但对于大型 XML 文档,内存使用可能会成为问题。另一方面,SaX 将以流方式处理您的 XML 文档,因此最终没有代表整个文档的对象模型。相反,您需要自己跟踪在文档中遇到的数据。

      对于这种情况,我的选择是使用 SaX 并跟踪文档中的所有查询,例如在 Map&lt;String, String&gt; 中(其中键是查询 ID,值是查询本身)。

      【讨论】:

      • @BlaiseDoughan 一定忍住了告诉他使用 JAXB 的冲动 :)
      【解决方案5】:

      DOM 规范定义了一种基于树的方法来导航 XML 文档 SAX 规范定义了一种基于事件的方法,解析器通过这种方法扫描 XML 数据,每当文档的某些部分调用处理函数 SAX 规范的优势在于它可以扫描和解析数千兆字节的 XML 文档而不会达到资源限制

      【讨论】:

        【解决方案6】:

        萨克斯解析器非常适合您的情况。我写了一篇关于Sax parsing的博文

        还有一篇关于how to choose a xml parser的博文

        希望这些对你有所帮助。

        【讨论】:

          猜你喜欢
          • 2011-03-04
          • 1970-01-01
          • 2020-01-17
          • 2014-06-30
          • 2011-11-01
          • 1970-01-01
          • 2012-07-03
          • 2012-07-28
          • 2010-09-16
          相关资源
          最近更新 更多