2017-05-14 10 views
0

Webサービスに投稿する必要があるXML文書があります。以下のファイル例。PowershellはXMLとして文字列を符号化します

<Budgets> 
    <Budgetline LocationName="Test Location 1" LocationCode="TL1" Period="201705" Amount="1276.000000"/> 
    <Budgetline LocationName="Test Location 2" LocationCode="TL2" Period="201705" Amount="1530.050000"/> </Budgets> 

このデータをエンコードされたXMLとしてWebサービスに投稿する必要があります。以下の例。

私はファイルを文字列として読み込み、それをXMLに変換しています。

[string]$budgetsfile = Get-Content "D:\Upload\TestData.xml" -Raw 
$xmlBudgets = ConvertTo-Xml $budgetsfile -As Stream -NoTypeInformation 

XMLデータをWebサービスにするために、エラーをバックスローobject要素<Object><Objects> XMLdata </Object></Objects>、でラップされているが。

タグを使用せずにXMLとしてデータをエンコードする方法はありますか。または、単にそれらを削除するためにstring.replace()を使用する必要があります。

石鹸の封筒はこのように見える必要があります。

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://example.com/XMLSchema-instance" xmlns:xsd="http://example.com/2001/XMLSchema" xmlns:soap12="http://example.com/2003/05/soap-envelope"> 
    <soap12:Body> 
    <upload xmlns="http://example.com"> 
     <authUser>$user</authUser> 
     <authPass>$pass</authPass> 
     <xmlData>&lt;Budgets&gt; 
    &lt;Budgetline LocationName=&quot;Test Location 1&quot; LocationCode=&quot;TL1&quot; Period=&quot;201705&quot; Amount=&quot;1276.000000&quot;/&gt; 
    &lt;Budgetline LocationName=&quot;Test Location 2&quot; LocationCode=&quot;TL2&quot; Period=&quot;201705&quot; Amount=&quot;1530.050000&quot;/&gt; 
&lt;Budgets&gt;</xmlData> 
    </upload> 
    </soap12:Body> 
</soap12:Envelope> 
+0

代わりの文字列をキャスト、なぜ私は特殊文字を削除するために符号化されたデータを取得できますか$ budgetsfile –

答えて

0

あなたが直接XMLにデータをキャストすることができます

[xml]$xmlBudgets = Get-Content "D:\Upload\TestData.xml" -Raw 

それをコードするために、あなたが使用することができます。

あなたはこの使用できるSOAPエンベロープのための
Add-Type -AssemblyName System.Web 
#below command will create the encoded string and assign it to variable 
$encoded = [System.Web.HttpUtility]::HtmlEncode($xmlBudgets.Innerxml) 

$head = @" 
<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://example.com/XMLSchema-instance" xmlns:xsd="http://example.com/2001/XMLSchema" xmlns:soap12="http://example.com/2003/05/soap-envelope"> 
    <soap12:Body> 
    <upload xmlns="http://example.com"> 
     <authUser>$user</authUser> 
     <authPass>$pass</authPass> 
     <xmlData> 
"@ 

$tail = @" 
</xmlData> 
    </upload> 
    </soap12:Body> 
</soap12:Envelope> 
"@ 

$head + $encoded +$tail 
+0

をしながら、あなたが直接XMLにキャストいけません。また、PowerShellのXMLデータ型を投稿できないため、データが文字列として必要になると思います。 – MarcusMaximus

+0

@MarcusMaximus私は答えを更新しました –

+0

ありがとうございましたが、それは私が欲しくないオブジェクト要素をエンコードしています。 < /オブジェクト> < /オブジェクト>。私は必要な石鹸の封筒の例を含めるように私の質問を更新しました。 – MarcusMaximus

0

ありがとうございました。解決策はXMLファイルを文字列として読み込み、Abhijith pk HtmlEncodeの提案を使用してエンコードしますが、XMLノードの代わりに文字列にエンコードすることでした。

[string]$xmlBudgets = Get-Content "D:\Upload\TestData.xml" -Raw 
Add-Type -AssemblyName System.Web 
$encoded = [System.Web.HttpUtility]::HtmlEncode($budgetsfile) 

石鹸の封筒はこのように見えます。

[xml]$SOAP_upload = '<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://example.com/XMLSchema-instance" xmlns:xsd="http://example.com/2001/XMLSchema" xmlns:soap12="http://example.com/2003/05/soap-envelope"> 
    <soap12:Body> 
    <upload xmlns="http://example.com"> 
     <authUser>$user</authUser> 
     <authPass>$pass</authPass> 
     <xmlData>'+$encoded+'</xmlData> 
    </upload> 
    </soap12:Body> 
</soap12:Envelope>' 
+0

本質的には私の答えと同じである –

+0

とよく似ていますが同じではありません。 PowerShellに慣れていない他の誰かが同様のソリューションを必要とする場合に備えて、実際の回答を含めることにしました。 '.innerXML'を使ったあなたの解決策は、Webサービスで受け入れられていなかったファイル「</Object > </Objects&gt」をラップしていました。 '$ encoded = [System.Web.HttpUtility] :: HtmlEncode()'を使用していただきありがとうございます。私はそれがなくてもそれを実現することはできませんでした。彼らは人々が利益を得ると感じる場合、私は答えとしてそれをマークするモッドのために幸せだろう。 – MarcusMaximus

+0

詳細をありがとう:) –