哪个解析器:SAX、DOM或xpath

  • 本文关键字:DOM xpath SAX 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>

它主要取决于用例。

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

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

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

或者,如果用例允许,Apaches commons蒸煮器可以是另一种建议,这与sax相比更容易,并且在内部使用sax。

并且xpath不是解析器。


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

如果您需要为简单的xml生成一个新的xml,您可以手动执行。我现在没有什么更好的选择了。

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

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

所以这取决于你的程序员是否比你的电脑贵。通常是这样。

如果你真的把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);

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

从技术上讲,XPath不是一种查询,而是一种用于从XML文档中选择节点的查询语言。

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

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

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

Sax解析器将非常适合您的情况。我写了一篇关于Sax解析的博客文章

以及另一篇关于如何选择xml解析器的博客文章

希望这些能对你有所帮助。

最新更新