我想弄清楚如何處理XML重複結構。在下面的例子中,史密斯先生應該有兩個孩子(麥克和湯姆),瑪格女士應該沒有孩子。湯姆,史密斯先生的孩子有一個名叫莎莉的孩子,他是史密斯先生的孫子。 Magoo女士沒有子女,也沒有孫子女。用重複結構解析XML
DECLARE @tableXML table (
ID int NOT NULL,
XMLdata xml NOT NULL
);
DECLARE @testXML xml
SET @testXML =
'<parent>
<name>Mr. Smith</name>
<child>
<name>Mike</name>
<child />
</child>
<child>
<name>Tom</name>
<child>
<name>Sally</name>
</child>
</child>
</parent>
<parent>
<name>Ms. Magoo</name>
<child>
<name />
<child />
</child>
</parent>'
INSERT INTO @tableXML VALUES
(1, @testXML);
SELECT
IsNull(parent.p.value('self::node()','varchar(100)'),Null) AS [Parent],
IsNull(children.c.value('self::node()','varchar(100)'),Null) AS [Child],
IsNull(grandChildren.g.value('self::node()','varchar(100)'),Null) AS [Grandchild]
FROM @tableXML
CROSS APPLY XMLdata.nodes('/parent/name') AS parent (p)
CROSS APPLY parent.p.nodes('/parent/child/name') AS children (c)
CROSS APPLY children.c.nodes('/parent/child/child/name') AS grandChildren (g)
的結果集的上面是:
Parent | Child | Grandchild
---------------------------------
Mr. Smith Mike Sally
Mr. Smith Tom Sally
Mr. Smith Sally
Ms. Magoo Mike Sally
Ms. Magoo Tom Sally
Ms. Magoo Sally
結果應該是:
Parent | Child | Grandchild
---------------------------------
Mr. Smith Mike
Mr. Smith Tom Sally
Ms. Magoo
的思考?
謝謝! 邁克
大,那你提供了一些* copy'n'paste *測試代碼! +1從我身邊 – Shnugo
這是有限的深度(在這種情況下:3級),或者你在尋找一種通用的方法(可能莎莉也有孩子)? – Shnugo
Btw:怎麼樣'IsNull()'?如果它是'NULL',則返回'NULL'? – Shnugo