Powershell - 将新数据添加到XML

时间:2016-05-18 09:09:04

标签: powershell

我有一部分脚本调用主机属性的API。如果API失败,它会检查是否存在包含属性的文本文件(来自之前的运行)。如果该文件不存在,我需要将UNKNOWN添加到属性节点。请参阅下面的XML中的预期结果。 XML将以没有属性的方式开始,因为脚本是用于填充此信息的。

  <?xml version="1.0" encoding="ISO-8859-1" ?> 
- <netprobe compatibility="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schema.itrsgroup.com/GA2011.2-110303/netprobe.xsd">
- <selfAnnounce>
  <enabled>true</enabled> 
  <retryInterval>60</retryInterval> 
  <requireReverseConnection>false</requireReverseConnection> 
- <probeName>
  <hostname /> 
  <data>_</data> 
  <port /> 
  <data>-SA</data> 
  </probeName>
- <managedEntity>
  <name>TestBox</name> 
- <attributes>
  <attribute name="Business Unit">UNKNOWN</attribute> 
  <attribute name="Department">UNKNOWN</attribute> 
  <attribute name="Team">UNKNOWN</attribute> 
  <attribute name="Environment">UNKNOWN</attribute> 
  <attribute name="ServerModel">UNKNOWN</attribute> 
  <attribute name="datacentre">UNKNOWN</attribute> 
  <attribute name="Application">UNKNOWN</attribute> 
  <attribute name="Description"UNKNOWN</attribute> 
  </attributes>
  <types>
  </types>
    </managedEntity>
    <gateways>
    </gateway>
    </gateways>
  </selfAnnounce>
</netprobe>

如何添加数据?我认为这将是我将为每个属性名称

运行的类似内容
[xml]$XML = Get-Content C:\selfannounce.xml
$tempchild = $xml.CreateElement("attribute")
$tempchild.InnerText = "Unknown"
$a = $XML.SelectSingleNode("//attributes")
$a.AppendChild($tempchild)

[xml]$XML.Save("C:\selfannouncetest.xml")

但这给了我以下的信息。

  <attributes>
    <attribute>Unknown</attribute>
  </attributes>

我不知道如何获得“attribute name =”部分。

<attribute name="Business Unit">UNKNOWN</attribute> 

任何人都知道实现这一目标的最佳方法吗?它将被添加到以下代码

Try {
$API = New-Object System.Net.WebClient
$APIData = $API.DownloadString($FullURL)
Set-Content -Value $APIdata -Path $APIDataFile -Force
#$Newdata = Get-Content C:\API.txt
}
catch [Net.WebException] {
$CheckAPIFile = Test-Path $APIDataFile 
If ($CheckAPiFile -eq $true){
$APIdata = Get-Content $APIDataFile
}
Else {

#Create attributes and add UNKNOWN

} 
}

另外,如果API调用成功或文本文件存在,如何将以下内容添加到逻辑中?不知道在上面的脚本中将其插入的位置

[xml]$XML = Get-Content $SelfannounceXMLEdit
($APIData -split "`n") | Where-Object { $_.Trim() } | ForEach-Object {
    $tempchild = [xml]$_.Trim()
    $attribute = $xml.ImportNode($tempchild.attribute, $true)
    $newType = $XML.netprobe.selfAnnounce.managedEntity.selectsinglenode("attributes").AppendChild($attribute)
}
$XML.Save($SelfannounceXMLEdit)

请注意,必须使用PowerShell 2.0。

1 个答案:

答案 0 :(得分:1)

使用SetAttribute() method

$tempchild = $xml.CreateElement("attribute")
$tempchild.InnerText = "Unknown"

$tempchild.SetAttribute("name","Name value goes here")

$a = $XML.SelectSingleNode("//attributes")
$a.AppendChild($tempchild)