我正在尝试从Standalone.xml(野生蝇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).Below是文件,
<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>有谁能告诉我这里有什么问题吗?
发布于 2015-09-11 12:30:08
/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']例如,对于前缀或声明命名空间。,ds3,然后,要简单得多,这是可行的:
/server/ds3:subsystem虽然这修复了您的表达式,但是它不会找到任何东西,因为subsystem不是server的子代。使用:
/server/profile/ds3:subsystemhttps://stackoverflow.com/questions/32523507
复制相似问题