2016-05-10 29 views
0

私はPowerShellを初めてお使いになり、最初のスクリプトを作成しようとしています。私はPowerShell v2.0を使用しています。私は、API呼び出しを行い、データを$data変数にする以下のスクリプトを持っています。PowerShell - XMLデータへのAPIデータ

$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> 

私はこの1つで開始する場所を確認していません。私はそれが以下のようなものになるだろうと思ったが、結果は、彼らが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に変換しようとしましたが、エラーが続いています。 XMLとしてAPIをエクスポートしようとしましたが、エラーが発生しました。どんな助けもありがとう。

+0

次回は有効なxml-samplesを含めてください。ここに要素がたくさんあります。 –

+0

こんにちはF、謝罪、私は完全なXMLファイルを表示するためのポストを更新しました。ありがとうございます –

+0

彼らはちょうど表示され、結果がどのようになるかの例です。 XMLはテンプレートであり、属性はありません。 APIコールは、XMLのインポートが必要なホストの属性を取得します。 –

答えて

1
  • エレメントタイプAFAIKを変更することはできないため、AttributeNameノードは役に立たない。
  • ...managedEntity.attributesは意味し、空であるドットaccesing AppendChild()

私はAPIから各文字列のためのXML文書を作成していない空の文字列を返すとするattributeノードをインポートしますそれを「本当の」XMLファイルを作成し、それを追加します。実際にattributesノードを取得するには、ex SelectSingleNode()を使用することを忘れないでください。試してください:

[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'を読み込んでいないことを忘れてしまったので、ループ内で一度に1つの属性を取得するために改行で分割する必要があります。 Btw。回答は編集しないでください。コメントに小さなエラーを投稿することができます。大きなコードブロック/エラーメッセージを質問の更新として追加する必要があります。 –

+0

こんにちはフロド、ヒントをありがとう。まだStackExchangeの初心者であり、非常に参考になっています。それは動作しているようだが、次のエラーメッセージが表示されます。 "" System.Xml.XmlDocument ""に値を変換できません。エラー:「ルート要素がありません」最後の属性が2回追加されます。何か案は?エラーが$ tempchild = [xml] $ _ –

+1

に届いています。分割後に空白の値が表示されています。おそらく私はLFで分割したような改行(CR)でしょう。更新された回答を試してください –

関連する問題