Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 xml.modify() не совсем понятна логика првого нода  [new]
Василий Алибабаевич
Member

Откуда: Москва
Сообщений: 567
Добрый день!

Начал юзать SQL Server 2005 Express
Опыта нет вообще потому ногами не пинать сильно.

запускаю такой T-SQL:
declare @pSiteTreeXml xml



set @pSiteTreeXml = N'<?xml version="1.0"  ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
</siteMap>'

 set @pSiteTreeXml.modify('insert <siteMapNode url="default.aspx" key="1" description="" title=""></siteMapNode> 
into (/siteMap)[1]')  
select @pSiteTreeXml
GO

выдает такой xml:

<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" />

Запускаю такой T-SQL:


declare @pSiteTreeXml xml


set @pSiteTreeXml = N'<?xml version="1.0"  ?>
<siteMap  >
</siteMap>'

 set @pSiteTreeXml.modify('insert <siteMapNode url="default.aspx" key="1" description="" title=""></siteMapNode> 
into (/siteMap)[1]')  
select @pSiteTreeXml
GO

Выдает такой XML
<siteMap>
  <siteMapNode url="default.aspx" key="1" description="" title="" />
</siteMap>

как то странно первый нод себя ведет когда ему присваиваешь атрибут xmlns

Че за хрень куда рыть
22 янв 06, 00:10    [2276028]     Ответить | Цитировать Сообщить модератору
 Re: xml.modify() не совсем понятна логика првого нода  [new]
VAlexey
Member

Откуда:
Сообщений: 130
Наверно, надо как-то различать элементы <siteMap xmlns=""> и <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
Для иллюстрации проверьте
declare @pSiteTreeXml xml

set @pSiteTreeXml = N'<?xml version="1.0"  ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
</siteMap><siteMap></siteMap>'

 set @pSiteTreeXml.modify('insert <siteMapNode url="default.aspx" key="1" description="" title=""></siteMapNode> 
into (/siteMap)[1]')  
select @pSiteTreeXml

Сравните с
declare @pSiteTreeXml xml

set @pSiteTreeXml = N'<?xml version="1.0"  ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
</siteMap>'

 set @pSiteTreeXml.modify('insert <siteMapNode url="default.aspx" key="1" description="" title=""></siteMapNode> 
into (/*[local-name()=''siteMap''])[1]')  
select @pSiteTreeXml
22 янв 06, 12:06    [2276267]     Ответить | Цитировать Сообщить модератору
 Re: xml.modify() не совсем понятна логика првого нода  [new]
Василий Алибабаевич
Member

Откуда: Москва
Сообщений: 567
Поидее XPath /siteMap должен идентифицировать нод вне зависимости от xmlns
23 янв 06, 17:21    [2279231]     Ответить | Цитировать Сообщить модератору
 Re: xml.modify() не совсем понятна логика првого нода  [new]
kka
Member

Откуда:
Сообщений: 20
Василий Алибабаевич
Поидее XPath /siteMap должен идентифицировать нод вне зависимости от xmlns

Не должно. Т.к. он должен работать и в ситуациях когда есть несколько разных /siteMap у каждого свой ns.
Лучше написать с указанием namespace вот так:

 set @pSiteTreeXml.modify('
declare namespace ns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0";
insert <siteMapNode url="default.aspx" key="1" description="" title=""></siteMapNode> 
into (/ns:siteMap)[1]')  
select @pSiteTreeXml
GO
23 янв 06, 18:25    [2279477]     Ответить | Цитировать Сообщить модератору
 Re: xml.modify() не совсем понятна логика првого нода  [new]
VAlexey
Member

Откуда:
Сообщений: 130
Василий Алибабаевич
Поидее XPath /siteMap должен идентифицировать нод вне зависимости от xmlns

На чем основана ваша уверенность?
А я почему-то всегда был уверен, что XPath запросы очень даже чувствительны к namespace.
Кстати, поищите в BOL раздел "Adding Namespaces Using WITH XMLNAMESPACES". Там есть примеры использования запросов, для нодов с namespace.
23 янв 06, 18:35    [2279502]     Ответить | Цитировать Сообщить модератору
 Re: xml.modify() не совсем понятна логика првого нода  [new]
Василий Алибабаевич
Member

Откуда: Москва
Сообщений: 567
kka
Василий Алибабаевич
Поидее XPath /siteMap должен идентифицировать нод вне зависимости от xmlns

Не должно. Т.к. он должен работать и в ситуациях когда есть несколько разных /siteMap у каждого свой ns.
Лучше написать с указанием namespace вот так:

 set @pSiteTreeXml.modify('
declare namespace ns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0";
insert <siteMapNode url="default.aspx" key="1" description="" title=""></siteMapNode> 
into (/ns:siteMap)[1]')  
select @pSiteTreeXml
GO


Спасибо за ответ вроде все ок. помогло
24 янв 06, 00:40    [2280099]     Ответить | Цитировать Сообщить модератору
 Re: xml.modify() не совсем понятна логика првого нода  [new]
Василий Алибабаевич
Member

Откуда: Москва
Сообщений: 567
VAlexey
Василий Алибабаевич
Поидее XPath /siteMap должен идентифицировать нод вне зависимости от xmlns

На чем основана ваша уверенность?
А я почему-то всегда был уверен, что XPath запросы очень даже чувствительны к namespace.
Кстати, поищите в BOL раздел "Adding Namespaces Using WITH XMLNAMESPACES". Там есть примеры использования запросов, для нодов с namespace.



Да я был не прав.

Ссылка на BOL полезная.

Внутри методов XML datatype нужно использовать
declare namespace
как описал kka
24 янв 06, 00:41    [2280101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить