2012-10-22 22 views
7

में अज्ञात नेमस्पेस के साथ XML को पार्स करना मुझे ओरेकल एसक्यूएल और एक्सएमएल के साथ परेशानी हो रही है।ओरेकल एसक्यूएल

मुझे बाहरी सिस्टम से अच्छी तरह से गठित XML डेटा के क्लब्स का भार मिल जाएगा, जिसमें कुछ तालिकाओं को पार्स, व्याख्या और भरें। मैंने XMLTable का उपयोग करके एक समाधान लिखा, जिसे तालिका में एक्सएमएल क्लोब कॉलम के साथ तालिका में एक दृश्य में रखा गया है और कुछ ऑडिट जानकारी और सामान (मैं इसे इस तरह से रखना चाहता हूं)।

NAMESPACES मुझे दुःस्वप्न दे रहे हैं। जाहिर है, मैं उन्हें xmlnamespaces खंड में नहीं डाल सकता, क्योंकि मैं कभी भी नहीं जानता कि वे होने जा रहे हैं। निरर्थक! उसी प्रकार के वितरित वस्तुओं के समय में अलग-अलग बिंदुओं पर अलग-अलग नामस्थान हो सकते हैं। कोई सीमित सूची नहीं है। डिफ़ॉल्ट xmlns भी स्थिर नहीं है।

अब तक का सबसे अच्छा काम करने वाला समाधान regexp_replace (3, सटीक होना) का एक सेट है, जो पार्सिंग से पहले सभी नामस्थान मिटा देता है। लेकिन प्रदर्शन एक विशाल मुद्दा है।

निश्चित रूप से कुछ चालाक है जो मुझे याद आ रही है?

+0

क्या आपके पास अपना कोड है ताकि हम आपकी सहायता कर सकें? – justderb

+0

ओरेकल सुरक्षा लागू करता है और बाहरी एक्सएमएल स्कीमा यूआरएल को किसी भी कॉल को रोकता है, इसका मतलब है कि सभी वैध स्कीमा को 'डीबीएमएस_एक्सएमएलएससीईएमए (स्कीमा पंजीकृत करें)' का उपयोग करके डेटाबेस में पंजीकृत होना आवश्यक है, बहुत सारे स्कीमा पहले ही डीबी में पंजीकृत हैं। हालांकि अगर वे नहीं हैं तो आपको उन सभी तृतीय पक्षों (एक्सएमएल भेजना) से उनकी सूची प्राप्त करनी होगी और उन्हें ओरेकल में पंजीकृत करना होगा। – Annjawn

उत्तर

5

मुझे पता है कि यह बहुत पुराना है, लेकिन मैंने इसे आज देखा और मुझे दर्द का सामना करना पड़ा जिसे मैंने नामांकित एक्सएमएल से निपटने का प्रयास किया। मेरा समाधान एक्सएसएलटी ट्रांसफॉर्म के साथ नामस्थानों को अलग करना था और इसे पुराने पुराने एक्सएमएल के रूप में संसाधित करना था। मैं जो काम करता था वह यह है:

function remove_namespace(i_xml in xmltype) 
    return xmltype 
is 
    v_xml xmltype default i_xml; 
    v_xsl varchar2(32767); 
begin 
    v_xsl := '<?xml version="1.0" encoding="UTF-8"?> 
     <xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
     <xsl:template match="*"> 
      <!-- remove element prefix (if any) --> 
      <xsl:element name="{local-name()}"> 
      <!-- process attributes --> 
      <xsl:for-each select="@*"> 
      <!-- remove attribute prefix (if any) --> 
      <!-- this if filters out any xmlns="" atts that have no 
       namespace prefix in the xml --> 
      <xsl:if test="(local-name() != ''xmlns'')"> 
       <xsl:attribute name="{local-name()}"> 
       <xsl:value-of select="."/> 
       </xsl:attribute> 
      </xsl:if> 
      </xsl:for-each> 
     <xsl:apply-templates/> 
     </xsl:element> 
     </xsl:template> 
     </xsl:stylesheet>'; 
    return v_xml.transform(xmltype(v_xsl)); 
end;