アイテムが従来の要素や属性ではなく、一種の「xml内のリスト」形式で配置されているため、通常とは異なるレイアウトのXMLファイルを細断処理しようとしています。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<ns:Lists xmlns:ns="urn:Listing">
<ns:items>
<ns:listRef>List1</ns:listRef>
<ns:name>Test list items</ns:name>
<ns:extendedFields>
<ns:extendedField>
<ns:name>Fruit</ns:name>
<ns:data>Apple</ns:data>
</ns:extendedField>
<ns:extendedField>
<ns:name>Vegetable</ns:name>
<ns:data />
</ns:extendedField>
<ns:extendedField>
<ns:name>Sweet</ns:name>
<ns:data>Crunchie</ns:data>
</ns:extendedField>
</ns:extendedFields>
</ns:items>
</ns:Lists>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
以下のXQueryのバリエーションを試しましたが、正しくありません。私がする必要があるのは、たとえば「select ns:data from x where ns:name='Fruit'」に相当するXpathです。以前は、シングルトン番号を使用してツリー上の必要なビットの場所を指すことができましたが、この場合、extendedFieldsの数は可変であり、シーケンスが変更されるため、必要なノードは、必要な名前と値のペアを指定することです。
DECLARE @x xml
SET @x =
( SELECT xml_data_column
FROM dbo.Table
WHERE xmlFileName = 'D:\XML_list.xml');
;WITH XMLNAMESPACES('urn:Listing' AS ns)
SELECT t.c.value('../ns:listRef[1]', 'varchar(20)') listRef
, t.c.value('../ns:name[1]', 'varchar(20)') name
, t.c.value('/.', 'varchar(30)') ext1b
, t.c.value('ns:extendedField[1]/ns:name[1]', 'varchar(30)') name1
, t.c.value('ns:extendedField[1]/ns:data[1]', 'varchar(30)') data1
, t.c.value('ns:extendedField[2]/ns:name[1]', 'varchar(30)') name2
, t.c.value('ns:extendedField[2]/ns:data[1]', 'varchar(30)') data2
, t.c.value('ns:extendedField[3]/ns:name[1]', 'varchar(30)') name3
, t.c.value('ns:extendedField[3]/ns:data[1]', 'varchar(30)') data3
FROM @x.nodes('//ns:Lists/ns:items/ns:extendedFields[1]') AS t(c)
したがって、この人がどの果物アイテムを選択したかを確認したい場合は、出力を次のように表示します。
listRef, name, Fruit
List1, Test list items, Apple