2017-06-25 40 views
0

我想弄清楚一種在xml中使用xpath(一種平坦化xml)遍歷多級多對多關係的方法。請看下面的例子詳細信息:如何使用Xpath解析具有多對多關係的多個層次的xml

<?xml version="1.0" encoding="UTF-8"?> 
    <Sale> 
    <CustomerDetail> 
     <CustomerCode><![[E]]></CustomerCode> 
     <CustRep> 
     <phoneNumber><![[000 000 0000]]></phoneNumber> 
     </CustRep> 
     <CustRep> 
     <phoneNumber><![[000 000 0000]]></phoneNumber> 
     </CustRep> 
    </CustomerDetail> 
    <CustomerDetail> 
     <CustomerCode><![[X]]></CustomerCode> 
     <CustRep> 
     <phoneNumber><![[000 000 0000]]></phoneNumber> 
     </CustRep> 
     <CustRep> 
     <phoneNumber><![[000 000 0000]]></phoneNumber> 
     </CustRep> 
     <CustRep> 
     <phoneNumber><![[000 000 0000]]></phoneNumber> 
     </CustRep> 
    </CustomerDetail> 
    </Sale> 

如在售的示例所示可以有很多爲CustomerDetails和爲CustomerDetail可以有很多CustReps。如何使用xpath將此xml結構平鋪到表中?在這方面的任何幫助是高度讚賞?

,如下圖所示所需的輸出:

CustomerCode Phone Number 
E 000 000 0000 
E 000 000 0000 
X 000 000 0000 
X 000 000 0000 
X 000 000 0000 
+3

壓扁到什麼呢?請顯示預期的輸出。 – OldProgrammer

+0

請用實際的RDBMS(產品和版本)標記,並請閱讀[如何問一個好的SQL問題](http://meta.stackoverflow.com/questions/271055/tips-for-asking-a-good-structured -query-language-sql-question/271056)和[如何創建一個MCVE](http://stackoverflow.com/help/mcve) – Shnugo

+0

btw:你的XML無效!這是如何產生的? 'CDATA'部分不正確... Btw2:你爲什麼需要'CDATA'部分? – Shnugo

回答

1

THX與預期輸出的編輯,但是你錯過說明你的RDBMS。閱讀XML是高度特定於供應商的!以下是SQL-Server的語法:

備註

  • XML無效CDATA部分不正確。最好的是使用適當的逃避並擺脫CDATA部分。
  • 我添加了一個流水號到您的手機號碼,看看它們的輸出更清晰

試試這個:

DECLARE @xml XML= 
'<?xml version="1.0" encoding="UTF-8"?> 
    <Sale> 
    <CustomerDetail> 
     <CustomerCode><![CDATA[E]]></CustomerCode> 
     <CustRep> 
     <phoneNumber><![CDATA[000 000 0001]]></phoneNumber> 
     </CustRep> 
     <CustRep> 
     <phoneNumber><![CDATA[000 000 0002]]></phoneNumber> 
     </CustRep> 
    </CustomerDetail> 
    <CustomerDetail> 
     <CustomerCode><![CDATA[X]]></CustomerCode> 
     <CustRep> 
     <phoneNumber><![CDATA[000 000 0003]]></phoneNumber> 
     </CustRep> 
     <CustRep> 
     <phoneNumber><![CDATA[000 000 0004]]></phoneNumber> 
     </CustRep> 
     <CustRep> 
     <phoneNumber><![CDATA[000 000 0005]]></phoneNumber> 
     </CustRep> 
    </CustomerDetail> 
    </Sale>'; 

    SELECT cd.value('(CustomerCode/text())[1]','nvarchar(max)') AS CustomerCode 
     ,cr.value('(phoneNumber/text())[1]','nvarchar(max)') AS phoneNumber 
    FROM @xml.nodes('/Sale/CustomerDetail') AS A(cd) 
    CROSS APPLY cd.nodes('CustRep') AS B(cr); 

結果

E 000 000 0001 
E 000 000 0002 
X 000 000 0003 
X 000 000 0004 
X 000 000 0005