Запрос xml для структуры, а не данных в SQL Server 2005 - PullRequest
0 голосов
/ 02 февраля 2011

Я хотел бы запросить метаданные об XML, чтобы помочь определить некоторую структуру XML.У меня есть xml-файл размером 49 МБ, который мне просто необходим, чтобы знать список всех свойств и дочерних тегов и некоторую базовую информацию о них.Могу ли я запросить это из самого XML-кода или мне нужно тщательно изучить его и найти каждый элемент и свойство, которые могут в нем существовать?Нет доступного определения схемы.

Учитывая некоторый случайный XML, подобный следующему:

DECLARE @x xml
SET @x = 
'<People>
 <Person age="35">
  <Name>Pete</Name>  
  <Phone>
   <Mobile>555-555-1234</Mobile>
   <Home>555-555-0001</Home>
  </Phone>
 </Person>
 <Person age="40" height="70 inches">
  <Name>Paul</Name>  
  <Phone>
   <Mobile>555-555-4567</Mobile>
  </Phone>
 </Person>
 <Person age="24">
  <Name>Susan</Name>  
  <Phone>
   <Home>555-555-2323</Home>
  </Phone>
 </Person>
</People>'

Как мне запросить это, чтобы получить что-то вроде следующего?Мне не нужен ни один набор записей (хотя это, конечно, было бы хорошо).Я был бы вполне доволен необходимостью повторять запросы, чтобы получить разные части.Возможно, мне придется сначала увидеть корневой тег «Люди», затем запросить «Люди» и увидеть тег «Человек», а затем, наконец, увидеть теги «Имя» и «Телефон» под этим именем и т. Д.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Извлечение структуры выполнимо (как показано в запросе ниже), но, как сказал Джон ... почему? Если это для обеспечения соблюдения ограничений, тогда используйте xsd и вместо этого прочтите это в своем приложении.

declare @data xml

set @data = '
<People>
 <Person age="35">
  <Name>Pete</Name>  
  <Phone>
   <Mobile>555-555-1234</Mobile>
   <Home>555-555-0001</Home>
  </Phone>
 </Person>
 <Person age="40" height="70 inches">
  <Name>Paul</Name>  
  <Phone>
   <Mobile>555-555-4567</Mobile>
  </Phone>
 </Person>
 <Person age="24">
  <Name>Susan</Name>  
  <Phone>
   <Home>555-555-2323</Home>
  </Phone>
 </Person>
</People>'

;with c_Tree (Parent, Node)
as  (   select  p.n.value('local-name(..)[1]', 'varchar(max)'),
                p.n.value('local-name(.)[1]', 'varchar(max)')
        from    @data.nodes('//*[local-name(.) > ""]') p(n)
    ),
    c_Expand(lvl, RootName, NodeName)
as (    select  0,
                Parent,
                Node
        from    c_Tree
        where   Parent = ''
        union all
        select  ce.lvl + 1,
                ct.Parent,
                ct.Node
        from    c_Tree ct
        join    c_Expand ce on
                ce.NodeName = ct.Parent
)
select   RootName+'>'+NodeName,
         lvl
from     c_Expand
order
by      lvl asc;
0 голосов
/ 11 мая 2011

Этот тип профилирования, вероятно, лучше всего выполнять через структурированный программный код.Тот факт, что xml может находиться в базе данных, не означает, что анализ xml должен выполняться там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...