gpt4 book ai didi

java - 按命名空间属性选择的 XPathExpression 不选择任何内容

转载 作者:数据小太阳 更新时间:2023-10-29 02:29:24 27 4
gpt4 key购买 nike

我正在尝试从 standalone.xml(Wildfly 9.0) 中提取数据库凭证(链接到 8.1 版本)。为此使用 XPath,我面临着我的 XPathExpression 无法正常工作的问题,

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

这条线,

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

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

"/server"

工作正常(NodeList 计数为 7)。下面是文件,

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

谁能告诉我这是什么问题?

最佳答案

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

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

相反,使用:

 /server/subsystem[namespace-uri()='urn:jboss:domain:datasources:3.0']/text()

但这没有意义,除非默认命名空间已经是 urn:jboss:domain:datasources:3.0


更好的方法

问题是:表达式将在无命名空间中寻找 subsystem,一无所获,然后永远不会使用谓词。

要解决此问题,请使用:

/server/*
[namespace-uri()='urn:jboss:domain:datasources:3.0']
[local-name() = 'subsystem']

Or declare the namespace ,例如对于前缀 ds3,然后,非常非常简单,这有效:

/server/ds3:subsystem

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

/server/profile/ds3:subsystem

关于java - 按命名空间属性选择的 XPathExpression 不选择任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32523507/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com