2015-12-28 32 views
2

我有點新的工作與XML在SQL中,並必須建立一個這樣的XML My Xml 並替換正確的值在哪裏(...)出現。t-sql:創建並添加幾個命名空間到xml

替換不是我的問題,否則創建出現在上一張圖片上的幾個名稱空間是。

DECLARE @XML XML 

SET @XML = (SELECT 
       (SELECT 
        (SELECT 'http://www.w3.org/2001/10/xmlexcc14n#' "@Algorithm" 
         FOR XML PATH('CanonicalizationMethod'), TYPE), 
        (SELECT 'http://www.w3.org/2001/04/xmldsigmore#rsasha256' "@Algorithm" 
         FOR XML PATH('SignatureMethod'), TYPE), 
        (SELECT '#FATCA' "@URI", 
          (SELECT 
            (SELECT 'http://www.w3.org/2001/10/xmlexcc14n#' "@Algorithm" 
             FOR XML PATH('Transform'), TYPE) 
           FOR XML PATH('Transforms'), TYPE), 
          (SELECT 'http://www.w3.org/2001/04/xmlenc#sha256' "@Algorithm" 
           FOR XML PATH('DigestMethod'), TYPE), 
          (SELECT '' 
           FOR XML PATH('DigestValue'), TYPE) 
         FOR XML PATH('Reference'), TYPE)        
       FOR XML PATH('SignedInfo'), TYPE), 
       (SELECT '' 
       FOR XML PATH('SignatureValue'), TYPE), 
       (SELECT 
        (SELECT 
          (SELECT '' 
           FOR XML PATH('X509SubjectName'), TYPE), 
          (SELECT '' 
           FOR XML PATH('X509Certificate'), TYPE) 
         FOR XML PATH('X509Data'), TYPE) 
       FOR XML PATH('KeyInfo'), TYPE), 
       (SELECT 'FATCA' "@Id", 
         (SELECT 
          (SELECT 
            (SELECT '' 
             FOR XML PATH('SendingCompanyIN'), TYPE), 
            (SELECT '' 
             FOR XML PATH('TransmittingCountry'), TYPE), 
            (SELECT '' 
             FOR XML PATH('ReceivingCountry'), TYPE), 
            (SELECT '' 
             FOR XML PATH('MessageType'), TYPE), 
            (SELECT '' 
             FOR XML PATH('Warning'), TYPE), 
            (SELECT '' 
             FOR XML PATH('Contact'), TYPE), 
            (SELECT '' 
             FOR XML PATH('MessageRefId'), TYPE), 
            (SELECT '' 
             FOR XML PATH('ReportingPeriod'), TYPE), 
            (SELECT '' 
             FOR XML PATH('Timestamp'), TYPE) 
           FOR XML PATH('MessageSpec'), TYPE), 
          (SELECT '' 
           FOR XML PATH('FATCA'), TYPE) 
         FOR XML PATH('FATCA_OECD'), TYPE) 
       FOR XML PATH('Object'), TYPE) 
      FOR XML PATH('Signature')) 

SELECT @XML 

這是我到目前爲止,它的作品完美。

我已經閱讀過這篇文章https://msdn.microsoft.com/en-us/library/ms177400.aspx,但並沒有真正幫助我,因爲我需要在xml中間使用命名空間並且無法弄清楚它是如何實現的。

有人能幫我嗎?

回答

2

您可以使用WITH XMLNAMESPACES來創建您需要的XML。將SET更改爲SELECT

就是這樣。

DECLARE @XML XML; 

WITH XMLNAMESPACES(DEFAULT 'http://www.w3.org/2000/09/xmldsig#', 
        'urn:oecd:ties:fatca:v1' as ftc, 
        'urn:oecd:ties:stffatcatypes' as sfa) 
SELECT @XML = (SELECT 
       (SELECT 
        (SELECT 'http://www.w3.org/2001/10/xmlexcc14n#' "@Algorithm" 
         FOR XML PATH('CanonicalizationMethod'), TYPE), 
        (SELECT 'http://www.w3.org/2001/04/xmldsigmore#rsasha256' "@Algorithm" 
         FOR XML PATH('SignatureMethod'), TYPE), 
        (SELECT '#FATCA' "@URI", 
          (SELECT 
            (SELECT 'http://www.w3.org/2001/10/xmlexcc14n#' "@Algorithm" 
             FOR XML PATH('Transform'), TYPE) 
           FOR XML PATH('Transforms'), TYPE), 
          (SELECT 'http://www.w3.org/2001/04/xmlenc#sha256' "@Algorithm" 
           FOR XML PATH('DigestMethod'), TYPE), 
          (SELECT '' 
           FOR XML PATH('DigestValue'), TYPE) 
         FOR XML PATH('Reference'), TYPE)        
       FOR XML PATH('SignedInfo'), TYPE), 
       (SELECT '' 
       FOR XML PATH('SignatureValue'), TYPE), 
       (SELECT 
        (SELECT 
          (SELECT '' 
           FOR XML PATH('X509SubjectName'), TYPE), 
          (SELECT '' 
           FOR XML PATH('X509Certificate'), TYPE) 
         FOR XML PATH('X509Data'), TYPE) 
       FOR XML PATH('KeyInfo'), TYPE), 
       (SELECT 'FATCA' "@Id", 
         (SELECT 
          (SELECT 
            (SELECT '' 
             FOR XML PATH('sfa:SendingCompanyIN'), TYPE), 
            (SELECT '' 
             FOR XML PATH('sfa:TransmittingCountry'), TYPE), 
            (SELECT '' 
             FOR XML PATH('sfa:ReceivingCountry'), TYPE), 
            (SELECT '' 
             FOR XML PATH('sfa:MessageType'), TYPE), 
            (SELECT '' 
             FOR XML PATH('sfa:Warning'), TYPE), 
            (SELECT '' 
             FOR XML PATH('sfa:Contact'), TYPE), 
            (SELECT '' 
             FOR XML PATH('sfa:MessageRefId'), TYPE), 
            (SELECT '' 
             FOR XML PATH('sfa:ReportingPeriod'), TYPE), 
            (SELECT '' 
             FOR XML PATH('sfa:Timestamp'), TYPE) 
           FOR XML PATH('ftc:MessageSpec'), TYPE), 
          (SELECT '' 
           FOR XML PATH('ftc:FATCA'), TYPE) 
         FOR XML PATH('ftc:FATCA_OECD'), TYPE) 
       FOR XML PATH('Object'), TYPE) 
      FOR XML PATH('Signature')); 

SELECT @XML; 

它看起來不像你在圖片中的樣子,但它在語義上是相同的XML。

更新:

爲了避免命名空間中的子節點腹脹,您可以使用XML變量建立每次一個級別,然後使用該變量在主查詢。

示例代碼:

declare @X xml; 

with xmlnamespaces(default 'N2', 
        'N3' as n3, 
        'N4' as n4) 
select @X = (
      select 2 as Elem2 
      for xml path('n4:SubElem'), type 
      ); 

with xmlnamespaces(default 'N1') 
select 1 as Elem1, 
     @X 
for xml path('Root') 

結果:

<Root xmlns="N1"> 
    <Elem1>1</Elem1> 
    <n4:SubElem xmlns:n4="N4" xmlns:n3="N3" xmlns="N2"> 
    <Elem2>2</Elem2> 
    </n4:SubElem> 
</Root> 

你甚至可以創建你的子節點的功能。

create function [dbo].[GetSubElem]() returns xml 
as 
begin 

    declare @X xml; 

    with xmlnamespaces(default 'N2', 
        'N3' as n3, 
        'N4' as n4) 
    select @X = (
       select 2 as Elem2 
       for xml path('n4:SubElem'), type 
      ); 

    return @x 
end 

並且像這樣使用它。

with xmlnamespaces(default 'N1') 
select 1 as Elem1, 
     dbo.GetSubElem() 
for xml path('Root') 
+0

謝謝Mikael。但並不完全解決我的問題,因爲現在我已經聲明所有名稱空間的所有xml標記...簽名標記必須具有xmlns =「http://www.w3.org/2000/09/xmldsig#」和ftc:FATCA_OECD標記全部其他命名空間...除了xmlns,因爲這個必須是urn:oecd:ties:fatca:v1 ...再次感謝.. – user2196272

+0

@ user2196272我知道。當您在子查詢中構建XML時,這是不必要的XML膨脹和SQL Server中的限制。但是XML仍然有效。對未使用的名稱空間的聲明不應該是一個問題,並且省略不使用的名稱空間,例如子元素中的默認名稱空間也不應該這樣做。這當然取決於你使用什麼樣的軟件來解釋XML,但是如果編寫得好,它應該沒有關係。 –

+0

@ user2196272更新了答案,您可以使用它來更好地控制名稱空間的添加位置,時間和方式。 –