2017-05-30 13 views
0

oracle extractvalue関数を使用してxmlデータを選択するにはどうすればよいですか?今年、ブランドのためにxmlデータを別のパスに選択するためのOracle抽出値

私が使用して情報を復元することができます

extractvalue(xmltype(x.xml, 0), '//Vehicle/Year') as VEC_YEAR, 

しかし、アドレスのために、私はエラーメッセージを持っている:ORA31011は、XML解析とORA19202とLPX00601に失敗:無効なトークン://ブランド/情報/データの/

SELECT 
     extractvalue(xmltype(x.xml, 0), '//Vehicle/Year') as VEC_YEAR, 
     extractvalue(xmltype(x.xml, 0), '//Vehicle/Brand') as VEC_BRAND, 
    CASE 
     WHEN extractvalue(xmltype(x.xml, 0), '//Brand/Info/Data/Address') IS NOT NULL THEN extractvalue(xmltype(x.xml, 0), '//Brand/Info/Data/Address') 
     WHEN extractvalue(xmltype(x.xml, 0), '//Brand/MainInfo/Info/Data/Address') IS NOT NULL THEN extractvalue(xmltype(x.xml, 0), '//Brand/MainInfo/Info/Data/Address') 
    END as Adress, 
    FROM xml_table x 

住所これらは私が照会する必要がありますXML:

<?xml version="1.0" encoding="utf-8"?> 
<VehicleValidation xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Validation Id="Validation"> 
     <Vehicle> 
      <Year>2017</Year> 
      <Brand>One car brand</Brand> 
     </Vehicle> 

     <Brand> 
      <Info> 
       <Data> 
        <Address> 
        One car brand Address 
        </Address> 
       <Data> 
      </Info> 
     </Brand> 
    </Validation> 
</VehicleValidation> 

<?xml version="1.0" encoding="utf-8"?> 
<VehicleValidation xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Validation Id="Validation"> 
     <Vehicle> 
      <Year>2017</Year> 
      <Brand>One car brand</Brand> 
     </Vehicle> 

     <Brand> 

      <MainInfo> 

       <Info> 
        <Data> 
         <Address> 
          One car brand Address 
         </Address> 
        <Data> 
       </Info> 

      </MainInfo> 
     </Brand> 
    </Validation> 
</VehicleValidation> 
+0

**参照している有効なXMLデータセットを表示してください。 – OldProgrammer

+0

質問に追加するだけです –

答えて

1

ここでは動作例を示します。 extractValue()を使用しないでください。廃止されました。 XML標準で定義されているSQL/XML演算子を使用する必要があります。 XML文書からリレーショナル行を抽出するにはXMLTABLEは選択する演算子である必要があります。

SQL> with MY_TABLE as 
    2 (
    3 select XMLTYPE(
    4 '<?xml version="1.0" encoding="utf-8"?> 
    5 <VehicleValidation xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    6  <Validation Id="Validation"> 
    7   <Vehicle> 
    8    <Year>2017</Year> 
    9    <Brand>One car brand</Brand> 
10   </Vehicle> 
11   <Brand> 
12    <Info> 
13     <Data> 
14      <Address> 
15      One car brand Address 
16      </Address> 
17     </Data> 
18    </Info> 
19   </Brand> 
20  </Validation> 
21 </VehicleValidation>') as XMLDOC 
22  from DUAL 
23  union all 
24 select XMLTYPE(
25 '<?xml version="1.0" encoding="utf-8"?> 
26 <VehicleValidation xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
27  <Validation Id="Validation"> 
28   <Vehicle> 
29    <Year>2017</Year> 
30    <Brand>One car brand</Brand> 
31   </Vehicle> 
32   <Brand> 
33    <MainInfo> 
34     <Info> 
35      <Data> 
36       <Address> 
37        One car brand Address 
38       </Address> 
39      </Data> 
40     </Info> 
41    </MainInfo> 
42   </Brand> 
43  </Validation> 
44 </VehicleValidation>') as XMLDOC 
45 from dual 
46 ) 
47 select Brand, Address 
48 from MY_TABLE, 
49   XMLTABLE(
50   '/VehicleValidation/Validation' 
51   passing XMLDOC 
52   COLUMNS 
53    BRAND VARCHAR2(32) PATH 'Vehicle/Brand', 
54    ADDRESS VARCHAR2(64) PATH 'Brand//Info/Data/Address' 
55  ) 
56/

BRAND       ADDRESS 
-------------------------------- ---------------------------------------------------------------- 
One car brand 
                One car brand Address 


One car brand 
                  One car brand Address 
1

方法について情報/データ/住所をブランドの下に置く? つまり、あなたが正確である必要がある場合は代わりに//ブランド/情報/データ/アドレスと//ブランド/ MainInfo /情報/データ/アドレス https://www.w3.org/TR/xpath/#path-abbrev

のXPathの//ブランド//情報/データ/アドレスを使用して、いつあなたの条件でextractvalueの代わりにexistsnodeを使ってみてください https://docs.oracle.com/cd/B12037_01/appdev.101/b10790/xdb04cre.htm#i1032763

ちなみに、Dataタグは投稿されたXMLタグで正しく閉じられません。

関連する問題