2013-03-03 128 views
1

背景:我想开发一个PowerShell脚本来操作* .regsvr文件的内容。这是一个XML文件,用于使用SQL Server Management Studio导出/导入注册的SQL服务器。这是一个blog pos t,讲述如何使用SQL查询来创建文件。我想做的不仅仅是创建一个文件,我想操纵现有的导出文件。默认的XML名称空间是否需要前缀?

问题:我遇到的问题是我无法弄清楚如何使用默认名称空间读取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查询使用前缀?

回答

1

即使以URL形式指定XML命名空间也不一定存在。他们主要是唯一的名字。您已经找到了访问默认名称空间中元素的正确方法 - 您必须指定一个前缀。我使用'dns'作为前缀来表示默认的命名空间。

+2

或者换句话说:在XPath中,没有前缀总是意味着没有命名空间。要访问名称空间中的元素,您需要一个前缀。即使在源文档中,它也是默认的命名空间。 – 2013-03-03 23:07:53

+0

@MichaelKay感谢您的澄清。 +1 – 2013-03-04 01:35:49

相关问题