2017-05-30 25 views
0

如何使用oracle extractvalue函数选择xml数据,当我确实有两种不同的路径来寻址信息时?Oracle extractvalue选择xml数据到不同路径

为一年,品牌,我可以使用恢复的信息:

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