首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按命名空间属性选择的XPathExpression不选择任何

按命名空间属性选择的XPathExpression不选择任何
EN

Stack Overflow用户
提问于 2015-09-11 12:26:04
回答 1查看 631关注 0票数 3

我正在尝试从Standalone.xml(野生蝇9.0) (链接到8.1版本)中提取数据库凭据。为此使用XPath,我面临着XPathExpression不能正常工作的问题,

代码语言:javascript
复制
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
builder = factory.newDocumentBuilder();
org.w3c.dom.Document doc = builder.parse(System.getProperty("jboss.server.config.dir") + "/standalone.xml");

XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("/server/subsystem[@xmlns='urn:jboss:domain:datasources:3.0']/text()");

NodeList nl = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);

System.out.println("NodeList count " + nl.getLength());

这条线

代码语言:javascript
复制
"/server/subsystem[@xmlns='urn:jboss:domain:datasources:3.0']/text()"

不是从子系统元素中获取节点(NodeList计数为0),

代码语言:javascript
复制
"/server"

工作正常(NodeList计数为7).Below是文件,

代码语言:javascript
复制
<server xmlns="urn:jboss:domain:3.0">
    <profile>            
        <subsystem xmlns="urn:jboss:domain:bean-validation:1.0"/>
        <subsystem xmlns="urn:jboss:domain:datasources:3.0">
            <datasources>
                <datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
                    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
                    <driver>h2</driver>
                    <security>
                        <user-name>sa</user-name>
                        <password>sa</password>
                    </security>
                </datasource>
            </datasources>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:deployment-scanner:2.0">
            <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" runtime-failure-causes-rollback="${jboss.deployment.scanner.rollback.on.failure:false}"/>
        </subsystem>
    </profile>
</server>

有谁能告诉我这里有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-11 12:30:08

/server/subsystem@xmlns='urn:jboss:domain:datasources:3.0'/text()

这个表达式是针对属性xmlns进行测试的,该属性不可能存在,因为它是被禁止的。该伪属性用于声明名称空间,并且与任何名称空间属性(包括xmlns:xsl等)一样,您不能直接访问它们。

相反,请使用:

代码语言:javascript
复制
 /server/subsystem[namespace-uri()='urn:jboss:domain:datasources:3.0']/text()

但是,除非默认名称空间已经是urn:jboss:domain:datasources:3.0,否则这是没有意义的。

更好的方法

问题是:表达式将在无命名空间中查找subsystem,找不到任何东西,然后谓词将永远不会被使用。

若要解决此问题,请使用以下任一项:

代码语言:javascript
复制
/server/*
    [namespace-uri()='urn:jboss:domain:datasources:3.0']
    [local-name() = 'subsystem']

例如,对于前缀或声明命名空间。ds3,然后,要简单得多,这是可行的:

代码语言:javascript
复制
/server/ds3:subsystem

虽然这修复了您的表达式,但是它不会找到任何东西,因为subsystem不是server的子代。使用:

代码语言:javascript
复制
/server/profile/ds3:subsystem
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32523507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档