如果xml节点具有相同的节点名称,如何正确定位xml节点?

时间:2012-07-03 11:35:14

标签: xml powershell xml-parsing powershell-v2.0

我有一个类似于下面的xml文件。

<Parameters>
  <Parameter IsEncrypted="False">
    <ParameterName>pRdGpInstallOptions</ParameterName>
    <ParameterValue>Custom</ParameterValue>
  </Parameter>
  <Parameter IsEncrypted="False">
    <ParameterName>pRdAccept</ParameterName>
    <ParameterValue>true</ParameterValue>
  </Parameter>
  <Parameter IsEncrypted="False">
    <ParameterName>pCboEditSQLServer</ParameterName>
    <ParameterValue>MachineName\SQLEXPRESS</ParameterValue>
  </Parameter>
</Parameters>

我这里只复制了几个节点。实际上,真实文件可能有数百个参数节点。

我们无法对索引进行硬编码,因为它可能以任何顺序出现。我正在尝试检索与参数名称"pCboEditSQLServer"关联的SQL实例名称参数值。

我想使用powershell检索此值。如何解析这个动态的xml文件?

2 个答案:

答案 0 :(得分:8)

$sql = $xml.Parameters.Parameter | Where-Object {$_.ParameterName -eq 'pCboEditSQLServer'}
$sql.ParameterValue

MachineName\SQLEXPRESS  

这是使用xpath的另一种选择(应该更快):

$path = "/Parameters/Parameter[ParameterName='pCboEditSQLServer']/ParameterValue"
$xml.SelectSingleNode($path).'#text'

还有Select-Xml cmdlet:

$sql = $xml | Select-Xml -XPath $path 
$sql.Node.'#text'

答案 1 :(得分:3)

阅读XML:

$xml = [xml](gc test.xml -Encoding utf8)

使用对象模型检索数据:

$xml.Parameters.Parameter | ? { $_.ParameterName -eq "pCboEditSQLServer" } | Select-Object -Property ParameterName, ParameterValue