2011-02-02 21 views
0

いくつかのXMLの構造を決定するのに役立つように、XMLに関するメタデータをクエリしたいと思います。私はすべてのプロパティと子タグのリストとそれらの基本情報を知る必要がある49 MB 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タグを確認しなければならない場合があります。

+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; 
関連する問題