2016-05-10 3 views
0

Я новичок в powershell и пытаюсь написать свой первый скрипт. Я использую PowerShell v2.0. У меня есть следующий скрипт, который вызывает вызов API и получает данные в переменную $data.PowerShell - данные API в XML

$FullURL = $url1+$url2+$Url3 
$client = New-Object System.Net.WebClient 
$data = $client.DownloadString($FullURL) 
Set-Content -Value $data -Path 'c:\API.txt' 

$data выводит ниже (пример). Примечание. Результаты gettype() - это строка. -

<attribute name="Business Unit">Platform</attribute> 
<attribute name="Department">Channels Technology</attribute> 
<attribute name="Team">Stackexchange</attribute> 
<attribute name="Environment">World</attribute> 
<attribute name="ServerModel">Synology</attribute> 
<attribute name="datacentre">New York</attribute> 
<attribute name="Application">PowerShell Teacher</attribute> 
<attribute name="Description">Learn How To Use PowerShell</attribute> 

Мне нужно, чтобы получить указанное в поле ниже образец файла XML, между тегами атрибутов -

<selfAnnounce> 
     <enabled>true</enabled> 
     <retryInterval>60</retryInterval> 
     <requireReverseConnection>false</requireReverseConnection> 
     <probeName> 
      <hostname/> 
      <data>_</data> 
      <port/> 
      <data>-SA</data> 
     </probeName> 
     <managedEntity> 
      <name></name> 
      <attributes> 
      </attributes> 

Я не уверен, где начать с этого. Я думал, что это будет что-то вроде ниже, но результаты все в одном теге, возможно, потому, что они не являются pscustom объекты -

[xml]$XML = Get-Content $SelfannounceXMLEdit 
$data | ForEach-Object { 
$tempchild = $XML.CreateElement("Attributename") 
$tempchild.set_InnerText($_) 
$newType = $XML.netprobe.selfAnnounce.managedEntity.attributes.AppendChild($tempchild) 
} 
$XML.Save($SelfannounceXMLEdit) 

Это дает следующие результаты, которые, очевидно, неправильно для XML файл-

<attributes> 
<Attributename><attribute name="Business Unit">Platform</attribute> <attribute name="Department">Channels Technology</attribute> <attribute name="Team">Stackexchange</attribute> <attribute name="Environment">World</attribute> <attribute name="ServerModel">Synology</attribute> <attribute name="datacentre">New York</attribute> <attribute name="Application">PowerShell Teacher</attribute> <attribute name="Description">Learn How To User PowerShell</attribute></Attributename> 
    </attributes> 

Результаты должны выглядеть следующим образом -

<?xml version="1.0" encoding="ISO-8859-1"?> 
<netprobe compatibility="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://google.com/netprobe.xsd"> 
    <selfAnnounce> 
    <enabled>true</enabled> 
    <retryInterval>10</retryInterval> 
    <requireReverseConnection>false</requireReverseConnection> 
    <probeName> 
     <hostname /> 
     <data>_</data> 
     <port /> 
     <data>-SA</data> 
    </probeName> 
    <managedEntity> 
     <name></name> 
     <attributes> 
     <attribute name="Business Unit">Platform</attribute> 
     <attribute name="Department">Channels Technology</attribute> 
     <attribute name="Team">Stackexchange</attribute> 
     </attributes> 
     <types> 
     <type>Core</type> 
     <type>Core Windows</type> 
     <!--Autogenerated types--> 
     <!--End of Autogenerated types--> 
     </types> 
    </managedEntity> 
    <gateways> 
     <gateway> 
     <hostname>MFT556</hostname> 
     <port>1234</port> 
     </gateway> 
    </gateways> 
    </selfAnnounce> 
</netprobe> 

Пожалуйста, помогите мне решить эту проблему. Я попытался преобразовать $ data в xml, но продолжаю получать ошибки. Я попытался экспортировать API как XML, но получить ошибки. любая помощь приветствуется.

+0

В следующий раз включите действительные образцы xml. Здесь отсутствует множество элементов. –

+0

Hi Frode F, извинения, я обновил сообщение, чтобы показать полный XML-файл. Спасибо –

+0

Они просто показывают и пример того, как будет выглядеть результат. XML является шаблоном и не имеет никаких атрибутов. Вызов API получает атрибуты хоста, которые затем мне нужно импортировать в XML. –

ответ

1
  • Вы не можете изменить тип элемента AFAIK, поэтому AttributeName -node бесполезен.
  • ...managedEntity.attributes пуст, что означает точка-экранным это вернет пустую строку, которая не имеет AppendChild()

Я хотел бы создать XML-документ для каждой строки из API и импортировать attribute узел «реальный» xml-файл и добавьте его. Не забудьте использовать ex SelectSingleNode(), чтобы получить attributes -node, особенно в первый раз, когда он пуст. Попытайтесь:

[xml]$XML = Get-Content $SelfannounceXMLEdit 
($data -split "`n") | Where-Object { $_.Trim() } | ForEach-Object { 
    #Create XMLdocument for <attribute name="foo">bar</attribute> 
    $tempchild = [xml]$_.Trim() 

    #Import the attribute-node in the temp xmldocument to the "real" document context 
    $attribute = $xml.ImportNode($tempchild.attribute, $true) 

    #Append attribute-node 
    $newType = $XML.netprobe.selfAnnounce.managedEntity.selectsinglenode("attributes").AppendChild($attribute) 
} 
$XML.Save($SelfannounceXMLEdit) 
+1

Попробуйте обновить ответ. Забыл, что вы не читали '$ data' из файла, поэтому нам нужно разбить его на newline, чтобы получить один атрибут за один раз внутри цикла. Btw. ответы не должны редактироваться. Небольшие ошибки могут быть опубликованы в комментариях, большие блоки кода/сообщения об ошибках должны быть добавлены в качестве обновления к вопросу. –

+0

Привет Фродо, Спасибо за советы. все еще новичок в StackExchange, и вы были очень полезны. Это похоже на работу, однако я получаю следующее сообщение об ошибке: «Невозможно преобразовать значение» в тип «System.Xml.XmlDocument». Ошибка: «Элемент Root отсутствует». и последний атрибут добавляется дважды. Есть идеи? Ошибка возвращается к $ tempchild = [xml] $ _ –

+1

Вы получаете пустые значения после расщепления. Вероятно, линейный разрыв (CR), поскольку я только разделял LF. Попробуйте обновить ответ. –

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