2013-03-03 2 views
1

Фон: Я хотел бы разработать скрипт PowerShell для управления содержимым файла * .regsvr. Это файл XML, используемый для экспорта/импорта зарегистрированных SQL-серверов с помощью SQL Server Management Studio. Вот 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

Пространства имен XML не обязательно должны существовать, даже если они указаны в форме URL. Это прежде всего уникальные имена. Вы нашли правильный способ доступа к элементам в пространстве имен по умолчанию - вам нужно указать префикс. Я использую 'dns' в качестве префикса для представления пространства имен по умолчанию.

+2

Или иначе: в XPath префикс всегда не означает пространство имен. Для доступа к элементам в пространстве имен вам нужен префикс. Даже если в исходном документе это пространство имен по умолчанию. –

+0

@MichaelKay Спасибо за разъяснение. +1 –

Смежные вопросы