【问题标题】:Trying to get XML element试图获取 XML 元素
【发布时间】:2015-12-15 17:19:33
【问题描述】:

这是一段 XML 文件,我想使用 PowerShell 代码从中提取 IP 地址(此处为 172.31.24.8):

<?xml version="1.0"?>
<Configuration xmlns="http://www.tandberg.com/XML/CUIL/2.0" product="Cisco Codec" version="TC7.3.2.14ad7cc" apiVersion="2">
  <SIP item="1">
    <Profile item="1" maxOccurrence="1">
      <Proxy item="1" maxOccurrence="4">
        <Address item="1" valueSpaceRef="/Valuespace/STR_0_255_NoFilt">172.31.24.8</Address>
        <Discovery item="1" valueSpaceRef="/Valuespace/TTPAR_AutoManual">Manual</Discovery>
      </Proxy>
    </Profile>
  </SIP>
</Configuration>

我尝试使用Select-Xml,如其他 StackOverflow 示例中所述,但到目前为止没有成功。

正确实现这一目标的最简单方法是什么?

【问题讨论】:

  • 有关 PowerShell 代码的帮助:显示 PowerShell 代码并解释什么不能按预期工作。

标签: xml powershell select-xml


【解决方案1】:

我对 Powershell 不熟悉,因此无法为您提供 Powershell 代码,但我认为 Select-Xml 可以与 XPath 表达式一起使用。

鉴于您的 XML 文档,并且您可以通过某种方式注册一个 默认命名空间,以下 XPath 表达式将起作用:

/Configuration/SIP/Profile/Proxy/Address/text()

如果你不能注册一个默认的命名空间,也许你可以注册一个前缀和一个命名空间,例如

/tb:Configuration/tb:SIP/tb:Profile/tb:Proxy/tb:Address/text()

其中tb 必须对应命名空间http://www.tandberg.com/XML/CUIL/2.0Here is a link 解释了如何声明命名空间。


如果 Select-Xml 不能处理命名空间,请使用

/*[local-name() = 'Configuration']/*[local-name() = 'SIP']/*[local-name() = 'Profile']/*[local-name() = 'Proxy']/*[local-name() = 'Address']/text()

所有这些路径表达式的唯一结果将是

172.31.24.8

【讨论】:

    【解决方案2】:

    我终于让它工作了。

    这是一个返回所需输出的 ​​powershell 代码示例。

    $Path="Path\to\my\file.xml"
    $Namespace = @{tb="http://www.tandberg.com/XML/CUIL/2.0"}
    $xml = Select-Xml -Path $Path -Namespace $Namespace -XPath "//tb:Address"
    $xml | foreach {$_.node.InnerXML}
    

    这将返回 IP 地址值。

    我的原始代码没有在 XPath 中指定“tb:”,这是我的错误。

    感谢您的帮助!

    问候, 弗洛里安

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多