0

PowerShell を使用して実行する SQL クエリに基づいて XML ファイルを作成する必要があります。作成する必要がある XML のスキーマは既にわかっています。クエリ結果をループする必要があり、スキーマに従って各データ値を特定の XML ノードに追加したいと考えています。

クエリを実行して必要な結果を取得することはできますが、規定の形式に従ってデータを配置する際に問題が発生します。

これを達成しようとしている方法の例を次に示します。

**XML テンプレートの解析

$XmlTemplate= [xml](get-content $xml) ($xml はクライアントから取得したスキーマです)

***XML テンプレートの解析とタグへのジャンプ

$PlanIDXML= $XmlTemplate.NpiLink.PlanProvider.PlanID (データを入力する必要があるノードに到達するため)

**XML テンプレートの解析とタグへのジャンプ

$PlannameXML= $XmlTemplate.NpiLink.PlanProvider.PlanName (データを入力する必要があるノードに到達するため)

サンプルqry; プランから PlanID,PlanName を選択

**クエリを実行し、結果を $qryresults として保存したと仮定します***

foreach($qryresults の $result) {

$PlanID=$result.PlanID $PlanName=$result.PlanName

**クローンを作る

$NewPlanIDXML=$PlanIDXML.Clone()

**データに変更を加える

$NewPlanIDXML=$プランID

***追記

$PlanIDXML.AppendChild($NewPlanIDXML)

* プラン名についても同じことを行います **

$PlanNameXML=$result.PlanName

$XmlTemplate.Save('ファイルパス')

私の懸念は、クエリ結果で取得したプランまたはプラン ID ごとにこれを行う必要があり、タグとタグを生成し続け、それらを元のノードに追加してスキーマを保存する必要があることです。

したがって、クエリ結果に 10 個のプラン ID がある場合、新しいプラン ID タグとプラン名タグを引き続き生成する必要があります。

追加できません(system.stringをsystem.xmlに変換できないため)。私は本当に立ち往生しており、これを処理する方法についてより良いアプローチがあれば、私はすべて耳を傾けています.

よろしくお願いします!!!

4

1 に答える 1

2

これを少しオーバーエンジニアリングしている可能性があります。XML ノードのテンプレートがある場合は、それを文字列として扱い、適切な場所に値を挿入します。これらのノードの配列を文字列として生成し、それらを結合してディスクに保存します。

テンプレートが次のようになっているとします (生成された値が移動する場所にいくつかのトークンを自分で入力します)。

--Template.xml---
<Node attr="##VALUE1##">
  <Param>##VALUE2##</Param>
</Node>

そして、いくつかのクエリを実行してこれらのノードの束を生成し、VALUE1 と VALUE2 を埋めたいとします。次に、次のようなものが機能します。

$template = (gc .\Template.xml) -join "`r`n"
$val1Token = '##VALUE1##'
$val2Token = '##VALUE2##'

$nodes = foreach( $item in Run-Query)
{
   # simple string replace
   $result = $template
   $result = $result.Replace($val1Token, $item.Value1)
   $result = $result.Replace($val2Token, $item.Value2)
   $result
}

# you have all nodes in a string array, just join them together along with parent node
$newXml = (@("<Nodes>") + $nodes + "</Nodes>") -join "`r`n"

$newXml | out-file .\Results.xml
于 2012-08-18T00:53:56.873 に答える