2012-10-10 9 views
7

मैं किसी अन्य प्रक्रिया के बिना सीधे डेटाबेस से साइटमैप एक्सएमएल फ़ाइल (छवियों सहित) बनाना चाहता हूं (जैसे परिवर्तन या अन्य चाल)।एक्सएमएल पाथ के लिए बाल नोड्स में नेमस्पेस से कैसे बचें?

मेरे प्रश्न है:

;WITH XMLNAMESPACES(
    DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9', 
    'http://www.google.com/schemas/sitemap-image/1.1' as [image]) 
SELECT 
    (SELECT    
     'mysite' as [loc], 
     (select 
      'anotherloc' 
      as [image:loc] 
     for XML path('image:image'), type 
     ) 
    for xml path('url'), type 
) 
for xml path('urlset'), type 

रिटर्न:

<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <loc>mysite</loc> 
    <image:image xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
     <image:loc>anotherloc</image:loc> 
    </image:image> 
    </url> 
</urlset> 

लेकिन मैं इस उत्पादन की जरूरत है, बार-बार नाम स्थान घोषणा के बिना:

<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url> 
    <loc>mysite</loc> 
    <image:image> 
     <image:loc>anotherloc</image:loc> 
    </image:image> 
    </url> 
</urlset> 
+0

संबंधित [डीबीए पर] (http://dba.stackexchange.com/questions/23624/how-to-remove-xmlns-from-child-elements -with-for-xml/23697 # 23697) –

+0

संभावित डुप्लिकेट [एक्सएमएल पाथ के लिए उपयोग करते समय मैं नेस्टेड क्वेरी में अनावश्यक नामस्थान को कैसे हटा सकता हूं] (http://stackoverflow.com/questions/3242070/how-do-i- को दूर-बेमानी-नाम स्थान में नेस्टेड-प्रश्न-जब-का उपयोग कर के लिए एक्सएमएल-पथ) – Gabrielius

उत्तर

2

मुझे यकीन है कि आपको लगता है कि एहसास कर रहा हूँ अतिरिक्त otiose नेमस्पेस घोषणाएं XML दस्तावेज़ का अर्थ नहीं बदलती हैं, इसलिए यदि परिणाम बी पर जा रहा है ई एक्सएमएल-अनुरूप उपकरण द्वारा खपत, उन्हें कोई फर्क नहीं पड़ता। फिर भी मुझे पता है कि वहां कुछ टूल्स हैं जो एक्सएमएल नेमस्पेस को सही तरीके से नहीं करते हैं, और एक बड़े एक्सएमएल इंस्टेंस में अनावश्यक बार-बार नामस्थान घोषणाएं परिणाम के आकार को काफी हद तक फहरा सकती हैं, जो इसकी अपनी समस्याएं पैदा कर सकती हैं।

सामान्य में वहाँ कोई तथ्य यह है कि एक WITH XMLNAMESPACES उपसर्ग के दायरे के भीतर प्रत्येक SELECT...FOR XML बयान इसके परिणाम सेट में सबसे बाहरी XML तत्व (ओं) पर नाम स्थान घोषणाओं उत्पन्न होगा एसक्यूएल सर्वर के सभी एक्सएमएल का समर्थन संस्करणों में, चारों ओर हो रही है एसक्यूएल सर्वर 2012

अपने विशिष्ट उदाहरण में अप करने के लिए, आप SELECT रों को अलग करने के बजाय उन्हें घोंसला बनाने से, और घेर मूल तत्व के लिए ROOT सिंटैक्स का उपयोग, इस प्रकार से काफी वांछित एक्सएमएल के पास प्राप्त कर सकते हैं:

DECLARE @inner XML; 
WITH XMLNAMESPACES('http://www.google.com/schemas/sitemap-image/1.1' as [image]) 
SELECT @inner = 
( 
    SELECT  
     'anotherloc' AS [image:loc] 
    FOR XML PATH('image:image'), TYPE 
) 

;WITH XMLNAMESPACES( 
    DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9' 
) 
SELECT    
     'mysite' AS [loc], 
     @inner 
FOR XML PATH('url'), ROOT('urlset'), TYPE 

परिणाम:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
    <url> 
    <loc>mysite</loc> 
    <image:image xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns=""> 
     <image:loc>anotherloc</image:loc> 
    </image:image> 
    </url> 
</urlset> 

लेकिन यह दृष्टिकोण समस्या का एक पूरी तरह से सामान्य समाधान प्रदान नहीं करता है।

1

आप यूडीएफ का उपयोग कर सकते हैं। उदाहरण:

ALTER FUNCTION [dbo].[udf_get_child_section] (
    @serviceHeaderId INT 
) 
RETURNS XML 



BEGIN 

    DECLARE @result XML; 

    SELECT @result = 
    (
     SELECT 1 AS 'ChildElement' 
     FOR XML PATH('Child') 
    ) 

    RETURN @result 

END 


GO 

DECLARE @Ids TABLE 
( 
    ID int 
) 

INSERT INTO @Ids 
SELECT 1 AS ID 
UNION ALL 
SELECT 2 AS ID 

;WITH XMLNAMESPACES (DEFAULT 'http://www...com/content') 
SELECT 
    [dbo].[udf_get_child_section](ID) 
FROM 
    @Ids 
FOR XML PATH('Parent') 

परिणाम:

<Parent xmlns="http://www...com/content"> 
    <Child xmlns=""> 
    <ChildElement>1</ChildElement> 
    </Child> 
</Parent> 
<Parent xmlns="http://www...com/content"> 
    <Child xmlns=""> 
    <ChildElement>1</ChildElement> 
    </Child> 
</Parent> 
संबंधित मुद्दे