我正在嘗試使用 PL/SQL 中的 XMLTable 提取 xml 值。
DECLARE
xdata XMLType := XMLType(
'<?xml version="1.0" encoding="UTF-8"?>
<stusMsg xmlns="http://www.my.namespace.com/src">
<messageHeader>
<sourceSystem>PFS</sourceSystem>
<originatingSystem>MRTI HKH</originatingSystem>
</messageHeader>
<messageDetail>
<TradeRef>1033796</TradeRef>
<TradeRefType>Ticket</TradeRefType>
<Company>MY_CMPY</Company>
<TradeGREF></TradeGREF>
<TradeType>TRD</TradeType>
<PriorityType>CRS</PriorityType>
<Priority>1</Priority>
</messageDetail>
</stusMsg>');
CURSOR get_data(x XMLType) IS
SELECT *
FROM XMLTABLE(xmlnamespaces(default 'http://www.my.namespace.com/src'),
'/stusMsg/messageDetail'
passing x
COLUMNS
TradeRef VARCHAR2(30) PATH 'TradeRef',
TradeRefType VARCHAR2(30) PATH 'TradeRefType');
BEGIN
FOR rec IN get_data(xdata) LOOP
dbms_output.put_line(rec.TradeRef);
dbms_output.put_line(rec.TradeRefType);
END LOOP;
END;
如果我不使用xmlnamespaces(default 'http://www.my.namespace.com/src')inXMLTABLE并且 xml ( xdata) 中存在命名空間,則不會提取這些值。
有沒有辦法告訴XMLTABLE忽略命名空間?所以該程式不依賴于xmlnamespaces
uj5u.com熱心網友回復:
如果只有默認命名空間,您可以xmlns從檔案根目錄中洗掉該屬性,而不是嘗試忽略命名空間:
DECLARE
v_dom DBMS_XMLDOM.DOMDocument;
xdata XMLTYPE := XMLTYPE('<?xml version="1.0" encoding="UTF-8"?>
<stusMsg xmlns="http://www.my.namespace.com/src">
<messageHeader>
<sourceSystem>PFS</sourceSystem>
<originatingSystem>MRTI HKH</originatingSystem>
</messageHeader>
<messageDetail>
<TradeRef>1033796</TradeRef>
<TradeRefType>Ticket</TradeRefType>
<Company>MY_CMPY</Company>
<TradeGREF></TradeGREF>
<TradeType>TRD</TradeType>
<PriorityType>CRS</PriorityType>
<Priority>1</Priority>
</messageDetail>
</stusMsg>');
CURSOR get_data(x XMLType) IS
SELECT *
FROM XMLTABLE(
'/stusMsg/messageDetail'
passing x
COLUMNS
TradeRef VARCHAR2(30) PATH 'TradeRef',
TradeRefType VARCHAR2(30) PATH 'TradeRefType'
);
BEGIN
v_dom := DBMS_XMLDOM.NEWDOMDOCUMENT(xdata);
DBMS_XMLDOM.REMOVEATTRIBUTE(
DBMS_XMLDOM.GETDOCUMENTELEMENT(v_dom),
'xmlns'
);
xdata := DBMS_XMLDOM.GETXMLTYPE(v_dom);
FOR rec IN get_data(xdata) LOOP
dbms_output.put_line(rec.TradeRef);
dbms_output.put_line(rec.TradeRefType);
END LOOP;
END;
/
哪個輸出:
1033796 Ticket
db<>在這里擺弄
uj5u.com熱心網友回復:
如果您真的不想尊重 XML 檔案中的命名空間,您可以通配所有節點參考:
SELECT *
FROM XMLTABLE(
'/*:stusMsg/*:messageDetail'
passing x
COLUMNS
TradeRef VARCHAR2(30) PATH '*:TradeRef',
TradeRefType VARCHAR2(30) PATH '*:TradeRefType');
db<>小提琴
但這似乎不太理想。如果可以的話,我會正確使用它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/415617.html
標籤:
上一篇:xsl將子元素分組到父標簽中
