哪个解析器:SAX,DOM或xpath?

时间:2012-08-01 13:19:16

标签: java xml

我有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>

6 个答案:

答案 0 :(得分:4)

主要取决于用例。

如果一般说话,SAX Parser适合解析大文件,dom parser适用于替代。

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

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

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

并且xpath不是解析器。


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

如果您需要为简单xml生成新的xml,则可以手动执行此操作。我现在不能建议任何更好的选择。

答案 1 :(得分:3)

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

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

所以这取决于你的程序员是否比你的计算机花费更多。通常他们会这样做。

答案 2 :(得分: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);

上面没有经过测试,但它应该给你一个想法。

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

Sax解析器将是您的理想选择。我撰写了一篇关于Sax parsing

的博客文章

以及how to choose a xml parser

上的另一篇博客文章 希望这些能帮到你。