小编Pie*_* M.的帖子

Java XPath:获取与查询匹配的所有元素

我想对此XML文件进行XPath查询(摘录显示):

<?xml version="1.0" encoding="UTF-8"?>
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST -->
<Component xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.Component:2.0" mmRelease="6.30" mmVersion="2.0" mmTimestamp="1180099591892" name="MassimaleContr" package="com.bi.massimalecontr" masterLanguage="it">
...
    <Component.UsedModels>
        <Core.Reference package="com.test.test" name="MasterModel" type="Model"/>
        <Core.Reference package="com.test.massimalecontr" name="MassimaleModel" type="Model"/>
        <Core.Reference package="com.test.test" name="TravelModel" type="Model"/>
    </Component.UsedModels>
...
Run Code Online (Sandbox Code Playgroud)

我正在使用这段代码:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document document = builder.parse(new File("E:\\Test branch\\test.wdcomponent"));
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();

xpath.setNamespaceContext(new NamespaceContext() {
...(omitted)

System.out.println(xpath.evaluate(
    "//d:Component/d:Component.UsedModels/d:Core.Reference/@name", 
    document));
Run Code Online (Sandbox Code Playgroud)

我期待得到的:

MasterModel
MassimaleModel
TravelModel
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

MasterModel
Run Code Online (Sandbox Code Playgroud)

似乎只返回第一个元素.如何获取与查询匹配的所有匹配项?

java xml xpath namespaces xml-namespaces

11
推荐指数
1
解决办法
3万
查看次数

Java XPath:具有默认命名空间xmlns的查询

我想对这个文件做一个XPath查询(摘录显示):

<?xml version="1.0" encoding="UTF-8"?>
<!-- MetaDataAPI generated on: Friday, May 25, 2007 3:26:31 PM CEST -->
<ModelClass xmlns="http://xml.sap.com/2002/10/metamodel/webdynpro" xmlns:IDX="urn:sap.com:WebDynpro.ModelClass:2.0">
    <ModelClass.Parent>
        <Core.Reference package="com.test.mypackage" name="ModelName" type="Model"/>
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码的片段:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document document = builder.parse(new File(testFile));
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext( new NamespaceContext() {
    public String getNamespaceURI(String prefix) {
...

String result = xpath.evaluate(xpathQueryString, document);
System.out.println(result);
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,当在XPath查询中引用默认命名空间时,不会调用getNamespaceURI方法来解析它.例如,此查询不提取任何内容:

//xmlns:ModelClass.Parent/xmlns:Core.Reference[@type=\"Model\"]/@package

现在我尝试通过替换xmlns伪造的前缀来"欺骗"解析器d,然后相应地编写getNamespaceURI方法(以便http://xml.sap.com/2002/10/metamodel/webdynprod遇到时返回).在这种情况下,getNamespaceURI调用它,但XPath表达式求值的结果始终为空字符串.

如果我从文件和XPath查询表达式中删除命名空间,我可以获得我想要的字符串(com.test.mypackage).

有没有办法使用默认命名空间使事情正常工作?

java xml xpath namespaces xml-namespaces

7
推荐指数
2
解决办法
6166
查看次数

Hibernate:使用 setFirstResult 和 setMaxResult 进行分页

我正在开发一个使用 Hibernate 作为 ORM 框架的 Java EE 项目。为了对查询结果进行分页,我使用 .setFirstResult 和 .setMaxResult 方法(Criteria API)。

问题是第一页显示正确,但当我转到第二页时,显示的第一个结果与第一页的最后一个结果相同。

通过将日志记录级别切换为调试,我成功捕获了 Hibernate 构建的 SQL 查询。他们是:

-- First page query (results from 1 to 10)
select * from ( select this_.DT_FINE_VAL as DT1_5_0_, this_.DT_INI_VAL as DT2_5_0_, this_.CD_TIPO_PERIODO as CD3_5_0_, this_.DT_AGGIORNAMENTO as DT4_5_0_, this_.DT_INSERIMENTO as DT5_5_0_, this_.CD_USERID_AGG as CD6_5_0_, this_.CD_USERID_INS as CD7_5_0_ from GPER0_POVS2.T_POVS2_PERIODI_FUNZ this_ order by this_.CD_TIPO_PERIODO desc ) where rownum <= 10;

-- Second page query (results from 11 to 20)
select * from ( select …
Run Code Online (Sandbox Code Playgroud)

java pagination hibernate

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×3

namespaces ×2

xml ×2

xml-namespaces ×2

xpath ×2

hibernate ×1

pagination ×1