7

Oracle SQL と XML に問題があります。

整形式の XML データの大量の塊を外部システムから取得して、解析、解釈し、いくつかのテーブルに入力します。XMLTable を使用してソリューションを作成しました。これは、問題の xml clob 列といくつかの監査情報などを含むテーブルのビューにレイアウトされています (この方法を維持したいと思います)。

名前空間は私に悪夢を与えています。どうやら、それらがどうなるかわからないため、それらをxmlnamespaces句に入れることはできません。ばかげている!同じタイプの配信されたアイテムは、異なる時点で異なる名前空間を持つ可能性があります。有限のリストはありません。デフォルトの xmlns でさえ一定ではありません。

私がこれまでに思いついた最善の解決策は、一連の regexp_replace (正確には 3 つ) であり、解析する前にすべての名前空間を消去します。しかし、パフォーマンスは巨大な問題です。

きっと私が見逃している賢い何かがありますか?

4

1 に答える 1

5

これがかなり古いことは知っていますが、今日見つけて、名前空間付きの XML を処理しようとして経験した苦労を思い出しました。私の解決策は、XSLT 変換を使用して名前空間を取り除き、それをプレーンな古い XML として処理することでした。私がこれを行うために使用した機能は次のとおりです。

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;
于 2012-12-20T22:14:06.643 に答える