我有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>
答案 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
的博客文章 上的另一篇博客文章 希望这些能帮到你。