2011-02-02 5 views
0

일부 XML의 구조를 확인하기 위해 XML에 대한 메타 데이터를 쿼리하고 싶습니다. 49MB xml 파일로 모든 속성 및 하위 태그 목록과 기본 정보를 알아야합니다. 이것을 XML 자체에서 질의 할 수 있습니까? 아니면 난이도를 거치고 거기에 존재할 수있는 각 요소와 속성을 찾아야합니까? 스키마 정의를 사용할 수 없습니다.SQL Server 2005의 데이터가 아닌 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>' 

가 어떻게이 다음과 같은 뭔가를 반환하는 쿼리 것 :

는 다음과 같은 어떤 임의의 XML을 감안할 때? 단일 레코드 세트는 필요하지 않습니다 (물론 좋을 것입니다). 반복적으로 쿼리하여 다른 부분을 얻는 데 상당히 만족할 것입니다. 먼저 루트 People 태그가있는 것을보고, People을 쿼리하고 Person 태그를보고, 마지막으로 Name 및 Phone 태그를 볼 것입니다.

People maxcount=1 
People.Person maxcount=3 [age maxlen=2 maxcount=3] [weight maxlen=9 maxcount=1] 
Person.Name textnode maxcount=1 maxlen=5 
Person.Name.Phone maxcount=1 
Person.Name.Mobile textnode maxcount=1 maxlen=12 
Person.Name.Home textnode maxcount=1 maxlen=12 
+0

왜 SQL Server를 사용하여이 작업을 수행 하시겠습니까? –

+0

좋은 지적. 나는 어제 그것에 대해 생각하고 있었다. 이런 종류의 메타 분석을 수행하는 것이 매우 편리 할 수도 있지만 실제로는 XML 라이브러리를 실행하고 분석을 직접하는 것입니다. – ErikE

답변

0

이 유형의 프로파일 링은 아마도 구조화 된 프로그램 코드를 통해 가장 잘 수행됩니다. XML이 데이터베이스에있을 수 있다는 이유만으로 xml 분석이 수행되어야한다는 것을 의미하지는 않습니다.

2

구조체를 추출하는 것이 가능합니다 (아래 쿼리에 설명되어 있음).하지만 John이 말한 것처럼 ... 왜? 제약 조건을 적용하려면 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;