【发布时间】:2019-01-24 17:38:03
【问题描述】:
我正在尝试从 XML 文件中选择节点,但遇到的问题似乎是由命名空间引起的。
下面的代码不返回任何内容。但是如果我从 XML 文件中删除命名空间,我会得到预期的结果。
MWE
$StandaloneXML = "test.xml"
# Load XML content
$NewStandaloneXML = New-Object -TypeName "System.XML.XMLDocument"
$NewStandaloneXML.Load($StandaloneXML)
# Get namespace
$Namespace = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $NewStandaloneXML.NameTable
$Namespace.AddNamespace("jboss", $NewStandaloneXML.DocumentElement.NamespaceURI)
$NewStandaloneXML.SelectNodes("jboss:server/interfaces/interface", $Namespace)
XML
<?xml version="1.0" ?>
<server xmlns="urn:jboss:domain:4.2">
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:127.0.0.1}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:127.0.0.1}"/>
</interface>
</interfaces>
</server>
预期输出
名称 inet 地址 ---- ------------ 管理网络地址 公共网络地址【问题讨论】:
-
您必须将命名空间前缀添加到它适用的所有元素:
jboss:server/interfaces/interface->/jboss:server/jboss:interfaces/jboss:interface -
@AnsgarWiechers 谢谢,那行得通。为什么需要它?没有继承吗?我正在努力寻找有关该主题的全面文档。
-
XML 节点从其父节点继承默认命名空间(并且只有默认命名空间)。然而,XPath 路径元素却没有。您可以通过本地名称 (
*[local-name()="nodename"]) 选择节点,但ns:nodename的可读性远不止于此,您不觉得吗?另外,related.
标签: xml powershell xpath namespaces xml-namespaces