5

次の簡単な例を見てください。

declare @myXml xml
set @myXML = '
<root>
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
</root>'
select t.c.query('.')
from @myXml.nodes('/root/line') t(c)

予想どおり、次のような 3 行が返されます。

<line id="1" />

ただし、XML がその名前空間を宣言する場合 (デフォルトの xmlns だけでも)、SQL でその名前空間も指定する必要があります。そうしないと、結果セットが空になります。私は2つの方法を知っています.nodes ()メソッド呼び出し内のdeclareステートメント、またはwith xmlnamespacesステートメントです。後者を使用しましょう:

declare @myXml xml
set @myXML = '
<root xmlns="urn:somename">
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
</root>';

with xmlnamespaces(default 'urn:somename')
select t.c.query('.')
from @myXml.nodes('/root/line') t(c)

結果が得られましたが、結果には明確な奇妙さがあります。指定された名前空間は、デフォルトではなく「p1」として追加されます。したがって、私の出力は次のようになります。

<p1:line xmlns:p1="urn:somename" id="1" />

このTechnet 記事のセクションB. デフォルトの名前空間の宣言は、私が達成しようとしていることを示していますが、D. デフォルトの名前空間を使用した構築に示されている結果が得られます。私の例は後者とあまり似ていないので、なぜこれらのプレフィックスを取得しているのか理解できません。

更新:完全を期すために、これはwith xmlnamespaces構文と まったく同じ症状を示します。

select t.c.query('.')
from @myXml.nodes('declare default element namespace "urn:somename";/root/line') t(c)
4

1 に答える 1

4

selectXML を最初にクエリするときに、既定の要素の名前空間を宣言します。すべての要素は、プレフィックスの代わりに既定の名前空間宣言を使用します。

declare @myXml xml
set @myXML = '
<root xmlns="urn:somename">
    <line id="1"/>
    <line id="2"/>
    <line id="3"/>
</root>';    
with xmlnamespaces(default 'urn:somename')
select t.c.query('
  declare default element namespace "urn:somename";
  .')
from @myXml.nodes('/root/line') t(c)

=>

<line xmlns="urn:somename" id="1" />
<line xmlns="urn:somename" id="2" />
<line xmlns="urn:somename" id="3" />
于 2013-10-29T15:33:59.053 に答える