Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪种解析器:SAX、DOM还是xpath?_Java_Xml - Fatal编程技术网

Java 哪种解析器:SAX、DOM还是xpath?

Java 哪种解析器:SAX、DOM还是xpath?,java,xml,Java,Xml,我有xml,我在上面运行查询,如下所述。哪个解析器sax、DOM或xpath最适合按id检索查询节点 你能不能用一些示例代码解释一下,这样对我会有很大帮助 我想编写一个泛型类,它通过id读取查询并向其传递参数。执行查询后返回值的最佳方式是什么,因为每个查询可能返回一组不同的值 <?xml version="1.0" encoding="UTF-8"?> <queries> <query id="getUserByName"> selec

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

从技术上讲,XPath不是查询,而是查询

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


对于这种情况,我的选择是使用SaX并跟踪文档中的所有查询,例如在一个映射中,键是查询ID,值是查询本身。

这主要取决于用例

一般来说,SAX解析器适用于解析大文件,dom解析器适用于替代文件

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

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

或者,如果用例允许,Apaches可以作为替代建议,这比sax更容易,并且在内部使用sax

xpath不是解析器

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


如果需要为简单的xml生成新的xml,可以手动生成。我现在无法推荐更好的替代方案。

DOM规范定义了一种基于树的方法来导航XML文档 SAX规范定义了一种基于事件的方法,通过这种方法,解析器可以扫描XML数据,并在文档的某些部分调用处理函数
SAX规范的优势在于,它可以扫描和解析价值千兆字节的XML文档,而不会达到资源限制,从可用性和程序员生产力的角度来看,它的性能更好:SAX最差,XPath最好

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

因此,这取决于你的程序员是否比你的计算机更贵。通常是这样。

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

和另一篇关于


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

如果您真的将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);

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

如果您想用xml存储sql查询,为什么不使用mybatis?您不必编写查询检索代码,您的jdbc代码将消失,您将免费获得缓存等功能。@BlaiseDoughan一定是忍住了让他使用JAXB的冲动:嗨!2019年的答案是否仍然是最新的?有新演员出现吗?