背景: *.regsvr ファイルの内容を操作する PowerShell スクリプトを開発したいと考えています。これは、SQL Server Management Studio で登録済みの SQL サーバーをエクスポート/インポートするために使用される XML ファイルです。これは、SQL クエリを使用してファイルを作成する方法について説明しているブログ投稿です。ファイルを作成するだけでなく、既存のエクスポート ファイルを操作したい。
問題: 私が抱えている問題は、既定の名前空間を使用して XmlDocument を読み取る方法がわからないことです。
期待どおりに動作しない名前空間の例:
$xmlstring = @'
<?xml version="1.0"?>
<model xmlns="http://schemas.serviceml.org/smlif/2007/02">
<identity/>
</model>
'@
$doc = new-object System.Xml.XmlDocument
$doc.LoadXml($xmlstring)
$nsmgr = new-object System.Xml.XmlNamespaceManager($doc.NameTable)
$nsmgr.AddNamespace([String]::Empty, "http://schemas.serviceml.org/smlif/2007/02")
$nsmgr.PushScope()
$xpath = "/model"
$doc.SelectNodes($xpath, $nsmgr).count
出力は 0 ですが、1 が予期されていました。
これは機能します:
$xmlstring = @'
<?xml version="1.0"?>
<model xmlns="http://schemas.serviceml.org/smlif/2007/02">
<identity />
</model>
'@
$doc = new-object System.Xml.XmlDocument
$doc.LoadXml($xmlstring)
$nsmgr = new-object System.Xml.XmlNamespaceManager($doc.NameTable)
$nsmgr.AddNamespace("x", "http://schemas.serviceml.org/smlif/2007/02")
$nsmgr.PushScope()
$xpath = "/x:model"
$doc.SelectNodes($xpath, $nsmgr).count
出力は 1 です。デフォルトの名前空間を指定し、xpath クエリでプレフィックスを使用しないようにするにはどうすればよいですか?