2016-05-18 4 views
0

У меня есть часть скрипта, который вызывает API для атрибутов хоста. Если API выходит из строя, он проверяет наличие текстового файла, содержащего атрибуты (из предыдущего прогона). Если файл не существует, мне нужно добавить UNKNOWN в узел атрибутов. См. Ожидаемый результат в XML ниже. XML начнет без атрибутов, поскольку сценарий предназначен для заполнения этой информации.Powershell - Добавить новые данные в 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> 

Я не знаю, как получить «атрибут 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

Используйте SetAttribute() method:

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

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

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

Это работало, я думал, что это что-то так просто. Цените помощь. Каков наилучший способ сделать это для всех из них? Создайте список и сделайте для каждого или создайте каждый отдельно? –

Смежные вопросы