如何在XML标记的末尾添加后缀数字?

时间:2014-11-22 06:24:53

标签: xml powershell

我在PowerShell中解析XML文件,但遇到了一个我无法找到解决方案的问题。

以下是xml文件的内容:

<hostcount>2</hostcount>

<hostconfig>
<hostname1>host1.fqdn.local</hostname1>
<hostroot1>root</hostroot1>
<hostpassword1>p@ssw0rd</hostpassword1>

<hostname2>host2.fqdn.local</hostname2>
<hostroot2>root</hostroot2>
<hostpassword2>p@ssw0rd</hostpassword2>
</hostconfig>

我希望能够将其转换为PowerShell中的变量。我正在解析XML文件,但是当我尝试将XML复制到变量中时,我得到一个错误。

以下是我的powershell脚本的片段:

$i = 1

$host1 = $xml.hostconfig.hostname$i 

现在,我知道上面的内容是错误的,但我如何让$i坚持下去呢?理想情况下,我想循环遍历XML并获取所有主机信息。

2 个答案:

答案 0 :(得分:1)

据我所知,您的XML文件格式不正确。你不能尝试以下方法:

$xml = @"
<Computers>
  <hostcount>2</hostcount>

  <hostconfig>
   <host>
     <hostname>host1.fqdn.local</hostname>
     <hostroot>root2</hostroot>
     <hostpassword>p@ssw0rd2</hostpassword>
   </host>

   <host>
     <hostname>host2.fqdn.local</hostname>
     <hostroot>root2</hostroot>
     <hostpassword>p@ssw0rd2</hostpassword>
   </host>

  </hostconfig>
</Computers>
"@

$a = [XML]$xml
$hostcount1 = $a.Computers.hostcount
$hostcount2 = $a.Computers.hostconfig.ChildNodes.count
$host1 = $a.Computers.hostconfig.ChildNodes[0].hostname

答案 1 :(得分:0)

我强烈建议您遵循@JPBlanc的建议。将对象详细信息指定为子节点

<host>
  <hostname>host1.fqdn.local</hostname>
  <hostroot>root2</hostroot>
  <hostpassword>p@ssw0rd2</hostpassword>
</host>
<host>
  <hostname>host2.fqdn.local</hostname>
  <hostroot>root2</hostroot>
  <hostpassword>p@ssw0rd2</hostpassword>
</host>

或作为属性

<host hostname='host1.fqdn.local'
  hostroot='root2'
  hostpassword='p@ssw0rd2' />
<host hostname='host2.fqdn.local'
  hostroot='root2'
  hostpassword='p@ssw0rd2' />
表示对象类的父节点的

比编号每个节点将其归于特定对象更有意义。

但是,如果由于某种原因您无法更改XML格式,则可以访问带编号的节点,如下所示:

$i = 1
$xml.hostconfig."hostname$i"