在问题中显示的XML是无效的,并会导致“LPX-00231:无效字符”如果你要的XMLType通过了它的错误。所以这不是你实际使用的字符串。在发布问题时,我假设发生了一个错误,并且实际上得到了声明的“LPX-00601:无效令牌”错误。所以我会以这个假设为基础,并以没有错字的字符串为基础。
extract
is deprecated;但即便如此,在这里使用它(与修正后的原始XML),你需要使用可选的第三个参数指定的命名空间:
select extract(xmltype.createxml(t.xml_data),
'//defaultmpftest:defaultmpftest/@test_id',
'xmlns:defaultmpftest="http://test.com"').getStringVal()
from t_testxml t;
EXTRACT(XMLTYPE.CREATEXML(T.XML_DATA),'//DEFAULTMPFTEST:DEFAULTMPFTEST/@TEST_ID','XMLNS:DEFAULTMPFTEST="HTTP://TEST.COM"').GETSTRINGVAL()
-----------------------------------------------------------------------------------------------------------------------------------------
1231
而不是使用过时的功能,你可以使用XMLQuery
:
select xmlquery(
'declare namespace defaultmpftest="http://test.com"; (: :)
//defaultmpftest:defaultmpftest/@test_id'
passing xmltype.createxml(t.xml_data)
returning content).getStringVal()
from t_testxml t;
XMLQUERY('DECLARENAMESPACEDEFAULTMPFTEST="HTTP://TEST.COM";(::)//DEFAULTMPFTEST:DEFAULTMPFTEST/@TEST_ID'PASSINGXMLTYPE.CREATEXML(T.XML_DATA)RETURNINGCONTENT).GETSTRINGVAL()
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1231
您将需要两个XMLQuery子句来获取这两个值。我通常会使用XMLTable
代替,这里示出与(固定的)经由一个CTE提供XML-AS-字符串:
with t_testxml(xml_data) as (select '<?xml version="1.0" encoding="UTF-8"?>
<defaultmpftest:defaultmpftest xmlns:defaultmpftest="http://test.com"
test_id="1231"
test_name="name_test">
<mpftestdata:additionalLinkUrl xmlns:mpftestdata="http://test2.com"/>
</defaultmpftest:defaultmpftest>' from dual
)
select x.test_id, x.test_name
from t_testxml t
cross join xmltable(
xmlnamespaces('http://test.com' as "defaultmpftest"),
'//defaultmpftest:defaultmpftest'
passing xmltype(t.xml_data)
columns test_id number path '@test_id',
test_name varchar2(30) path '@test_name'
) x;
TEST_ID TEST_NAME
---------- ------------------------------
1231 name_test
Read more about using these functions。
正如答案中指出的那样,您发布的原始XML无效,但如果按照所示方式运行,则在它有机会击中LPX-00601之前,会得到一个不同的错误 - LPX-00231。在内部节点名称开始处删除杂乱的'/'会使XML有效,然后会给出你显示的错误。显示您实际使用的内容很有帮助。 [查看如何创建一个MCVE](https://stackoverflow.com/help/mcve)。 –