2016-10-14 13 views
0

PowerShellスクリプトを使用してXMLタグを動的に追加します。 この場合NLogのカスタムElasticSearchターゲットを追加しようとしています(hereから)。カスタムネームスペースを含むXMLをロードする

$source = '<target name="elastic" xsi:type="BufferingWrapper"> </target>' 

[xml]$source 

または

$xml = New-Object -TypeName System.Xml.XmlDocument 
$xml.LoadXml($source) 

私は次のエラー

Cannot convert value "<targetname="elastic" xsi:type="BufferingWrapper"> </target>" to type "System.Xml.XmlDocument". Error: "'xsi' is an undeclared prefix."

任意の提案を取得を使用してXMLへの変換$source

ほとんどではなく、かなりあり:

それがこのケースでは動作しません<Object>を、使用しています、私はConvertTo-Xml $source -as Documentを使用することができますが、結果は<target>タグを使用していません。

<?xml version="1.0" encoding="utf-8"?> 
<Objects> 
    <Object Type="System.String">&lt;target name="elastic" xsi:type="BufferingWrapper" 
<Objects> 

答えて

1

this answerで説明するようにXMLフラグメントをロードできます。

$source = '<target name="elastic" xsi:type="BufferingWrapper"></target>' 
$sreader = New-Object IO.StringReader $source 
$xreader = New-Object Xml.XmlTextReader $sreader 
$xreader.Namespaces = $false 
$fragment = New-Object Xml.XmlDocument 
$fragment.Load($xreader) 

をしかし、あなたはいくつかの点で他のXMLデータ構造にそのフラグメントをインポートすると仮定し、そうすることは、おそらくにつながります他の問題(例えば、this questionを参照)。あなたのXMLフラグメントに適切な名前空間定義を持つダミーのルートノードを追加し、この問題を回避するには

$source = '<target name="elastic" xsi:type="BufferingWrapper"> </target>' 
[xml]$fragment = "<dummy xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>$source</dummy>" 

あなたは、このように別のXMLドキュメントにノードをインポートすることができますこの方法は、(他のXMLファイルを提供しました適切な名前空間の定義も含まれています)。

[xml]$xml = Get-Content 'C:\path\to\master.xml' 

$nsm = New-Object Xml.XmlNamespaceManager $xml.NameTable 
$nsm.AddNamespace('xsi', $xml.NamespaceURI) 

$node = $xml.ImportNode($fragment.DocumentElement.target, $true) 

$targets = $xml.SelectSingleNode('//targets', $nsm) 
$targets.AppendChild($node) | Out-Null 
関連する問題