我有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解析器的博客文章
希望这些能对你有所帮助。