2012-08-01 81 views
0

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

你可以请一些示例代码给我解释一下,这样可以帮助我很多吗?

我想编写一个泛型类,它通过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

请参考http://stackoverflow.com/questions/9758882/xml-parsing-using-java-with-getting-element-values-and-attribute-values – amicngh 2012-08-01 13:23:08

+1

如果你想在xml中存储sql查询,为什么不使用MyBatis的?您不必编写查询检索代码,您的jdbc代码就会消失,并且您可以免费获得缓存等功能。 – 2012-08-01 13:27:57

回答

4

它主要取决于用例。

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

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

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

或者Apaches commons-digester可以作为替代建议,如果使用情况许可比萨克斯更容易,并且在内部使用萨克斯。

xpath不是解析器。


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

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

2

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

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

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

+0

@BlaiseDoughan必须拒绝告诉他使用JAXB的冲动:) – 2013-04-22 16:59:38

1

DOM规范定义了基于树的方法来进行导航的XML文档,由此解析器扫描通过XML数据 该SAX规范定义的事件为基础的方法,在调用处理程序函数每当文件 的SAX的强度的某些部分规范是它可以扫描并解析千兆字节的XML文档而不会触及资源限制

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); 

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