Xml 具有多个名称空间的节点的XPATH

Xml 具有多个名称空间的节点的XPATH,xml,xpath,Xml,Xpath,我有一个XML文件,它的内容在同一级别上有多个名称空间 <?xml version="1.0" encoding="utf-8"?> <DeploymentConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.aveva.com/AVEVA/NET/deployment/5000"> <InstallDir>c:\temp</InstallD

我有一个XML文件,它的内容在同一级别上有多个名称空间

<?xml version="1.0" encoding="utf-8"?>
<DeploymentConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.aveva.com/AVEVA/NET/deployment/5000">
<InstallDir>c:\temp</InstallDir>
<DashBoardMSIPath>c:\temp</DashBoardMSIPath>
<InstallDir>c:\temp</InstallDir>
<DatabaseManager>
    <WorkhubDatabases>
        <WorkHubDatabaseConfiguration>
            <Server>Test</Server>
        </WorkHubDatabaseConfiguration>
    </WorkhubDatabases>
</DatabaseManager>
</DeploymentConfiguration>

c:\temp
c:\temp
c:\temp
试验

假设我需要更改服务器节点的值。服务器节点的XPath应该是什么。请提供帮助。

不要将文档中的命名空间定义误认为API中的命名空间定义

您的XML定义了2个名称空间

  • http://www.w3.org/2001/XMLSchema-instance
    带有前缀
    i
  • http://www.aveva.com/AVEVA/NET/deployment/5000
    不带前缀
XML解析器解析命名空间定义。如果命名空间
http://www.aveva.com/AVEVA/NET/deployment/5000
您可以读取节点名称,如:

{http://www.aveva.com/AVEVA/NET/deployment/5000}:Server
XPath处理器获取自己的命名空间定义。在大多数API中,名称空间解析器都是可用的

PHP 在PHP中,您可以在DOMXpath实例上注册名称空间:

$xpath = new DOMXpath($document);
$xpath->registerNamespace('av', 'http://www.aveva.com/AVEVA/NET/deployment/5000');
注册后,可以在XPath表达式中使用定义的前缀:

$nodes = $xpath->evaluate('/av:DeploymentConfiguration/av:DatabaseManager/av:WorkhubDatabases/av:WorkHubDatabaseConfiguration/av:Server');
Javascript 在JavaScript中,它是evaluate()的第三个参数:

XSLT 在XSLT中,可以像在任何其他XML中一样定义它们

<xsl:stylesheet
  version="1.0"
  xmlns:av="http://www.aveva.com/AVEVA/NET/deployment/5000">
  <!-- ... -->

</xsl:stylesheet> 

<xsl:stylesheet
  version="1.0"
  xmlns:av="http://www.aveva.com/AVEVA/NET/deployment/5000">
  <!-- ... -->

</xsl:stylesheet>