Plsql 我正在尝试用PL/SQL解析XML。我无法从标记中检索属性值,我做错了什么?

Plsql 我正在尝试用PL/SQL解析XML。我无法从标记中检索属性值,我做错了什么?,plsql,xml-parsing,xmlhttprequest,plsqldeveloper,Plsql,Xml Parsing,Xmlhttprequest,Plsqldeveloper,以下XML将不进行分析。请找到我使用的确切代码- DECLARE x XMLType := XMLType( '<ns0:CreateSODSOrder xmlns:ns0="http://schemas.dell.com/services/isp/OrderHistory/3.5" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" MessageType="CREATE"> <ns0:Crea

以下XML将不进行分析。请找到我使用的确切代码-

DECLARE
  x XMLType := XMLType(
    '<ns0:CreateSODSOrder xmlns:ns0="http://schemas.dell.com/services/isp/OrderHistory/3.5" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/" MessageType="CREATE">
  <ns0:CreateOrder>
    <ns0:SalesOrder ORDER_NUM="302199286" DPID="GB2003-2120-85049" PO_NUM="test" ORDER_BUID="202" DPS_NUM="" CHANNEL="ENTP" SUB_CHANNEL="GB_IC1A" ORDER_TYPE="GB ENT Order" REBOOKED_ORDER_NUM="" SALES_REP_NAME="SANJANA_D_C" ORIGINAL_ORDER_REF_NUM="" AMF_ORDER_NUM="" IR_NUM="GB2003-2120-85049" CCN="GB_IC1A" CUSTOMER_NUM="GB90117414" CUSTOMER_BUID="202" ORDER_DATE="2019-09-30T07:59:32" COUNTRY_NUM="GB" CCN_DESC="GB Indirect Certified  Tier 1A"/>
  </ns0:CreateOrder>
</ns0:CreateSODSOrder>');
BEGIN
  FOR r IN (
    SELECT ExtractValue(column_value,'Sales/@ORDER_NAME') as name
         -- ,ExtractValue(Value(p),'/row/Address/State/text()') as state
          --,ExtractValue(Value(p),'/row/Address/City/text()') as city
    FROM   TABLE(XMLSequence(Extract(x,'/CreateSODSOrder/CreateOrder/SalesOrder')))
    ) LOOP
          dbms_output.put_line(r.name);
  END LOOP;
    dbms_output.put_line('out');
END;

当我将ns0:与CreateSODSOrder/CreateOrder/SalesOrder一起使用时,它会抛出一个XML解析错误。

您将得到XML解析错误,因为缺少命名空间定义。 下面的代码将解决名称空间问题,但是如果不知道您想要什么,就很难获得值

声明 x XMLType:=XMLType ' '; 开始 对于r IN 选择ExtractValuecolumn_value,'Sales/@ORDER_NAME'作为名称 -,ExtractValueValuep,“/row/Address/State/text”作为状态 -,ExtractValueValuep,“/row/Address/City/text”作为城市 从表XMLSequenceExtractX,'/ns0:CreateSODSOrder/ns0:CreateOrder/ns0:SalesOrder',xmlns:ns0=http://schemas.dell.com/services/isp/OrderHistory/3.5' 环 dbms_output.put_liner.name; 端环; dbms_output.put_line'out'; 终止 使用XMLTABLE是一个好主意,因为ExtractValue有点过时,不受欢迎

下面添加了使用XMLTABLE获取属性的示例代码

声明 游标获取_数据为 选择* 从XMLTABLExmlnamespaces'http://schemas.dell.com/services/isp/OrderHistory/3.5“作为ns0,”http://schemas.xmlsoap.org/soap/envelope/'作为soap环境,'ns0:CreateSODSOrder/ns0:CreateOrder/ns0:SalesOrder' 传递xmltype' ' 柱 ORDER_NUM VARCHAR230路径'@ORDER_NUM', DPID VARCHAR230路径“@DPID”; 开始 对于get_数据循环中的rec_ dbms_output.put_linerec_.ORDER_NUM; dbms_output.put_linerec_.DPID; 端环; 终止