目的:写一个函数,根据表的某个clob字段(存储的是xml内容),及输入的标签,将对应的值取出来。
如:select getxmlattr(colname,'xsl:tel') as Tel from tablename;
问题:1、getnodevalue取不到节点的值。2、查找节点时,xpath如果含有namespace,则会报错:LPX-00601:Invalid token in...xml内容
<root>
<test>
<xsl:name>tom</xsl:name>
<xsl:prop>
<xsl:sex>man</xsl:sex>
<xsl:tel>110</xsl:tel>
</xsl:prop>
</test>
</root>代码:
CREATE OR REPLACE function getxmlattr(t_xml clob,AttrName varchar2)
return varchar2
as
tmpcontent clob;
xmlpar xmlparser.parser;
doc xmldom.domdocument;
rootnode xmldom.domnode;
tempnode xmldom.domnode; Avalue varchar2(100);
begin
if FPML is null or AttrName is null then
return(null);
else
tmpcontent := replace(t_xml,'xls:',''); --因为
end if; xmlpar := xmlparser.newparser;
xmlparser.parseClob(xmlpar,tmpcontent);
doc := xmlparser.getdocument(xmlpar); xmlparser.freeparser(xmlpar); rootnode := xmldom.makenode(doc);
tempnode := xslprocessor.selectSingleNode(rootnode,'//'||replace(AttrName,'xls:',''));
if xmldom.isNull(tempnode) then
xmldom.freenode(rootnode);
xmldom.freedocument(doc);
return(null);
end if;
Avalue := xmldom.getNodeValue(tempnode); --此处取不到值
Avalue := xmldom.getNodeName(tempnode)||'='||Avalue;
-- 释放文档对象
xmldom.freenode(tempnode);
xmldom.freenode(rootnode);
xmldom.freedocument(doc);
return(AValue);
exception
when others then
dbms_output.put_line(sqlerrm);
return(null);
end getxmlattr;
如:select getxmlattr(colname,'xsl:tel') as Tel from tablename;
问题:1、getnodevalue取不到节点的值。2、查找节点时,xpath如果含有namespace,则会报错:LPX-00601:Invalid token in...xml内容
<root>
<test>
<xsl:name>tom</xsl:name>
<xsl:prop>
<xsl:sex>man</xsl:sex>
<xsl:tel>110</xsl:tel>
</xsl:prop>
</test>
</root>代码:
CREATE OR REPLACE function getxmlattr(t_xml clob,AttrName varchar2)
return varchar2
as
tmpcontent clob;
xmlpar xmlparser.parser;
doc xmldom.domdocument;
rootnode xmldom.domnode;
tempnode xmldom.domnode; Avalue varchar2(100);
begin
if FPML is null or AttrName is null then
return(null);
else
tmpcontent := replace(t_xml,'xls:',''); --因为
end if; xmlpar := xmlparser.newparser;
xmlparser.parseClob(xmlpar,tmpcontent);
doc := xmlparser.getdocument(xmlpar); xmlparser.freeparser(xmlpar); rootnode := xmldom.makenode(doc);
tempnode := xslprocessor.selectSingleNode(rootnode,'//'||replace(AttrName,'xls:',''));
if xmldom.isNull(tempnode) then
xmldom.freenode(rootnode);
xmldom.freedocument(doc);
return(null);
end if;
Avalue := xmldom.getNodeValue(tempnode); --此处取不到值
Avalue := xmldom.getNodeName(tempnode)||'='||Avalue;
-- 释放文档对象
xmldom.freenode(tempnode);
xmldom.freenode(rootnode);
xmldom.freedocument(doc);
return(AValue);
exception
when others then
dbms_output.put_line(sqlerrm);
return(null);
end getxmlattr;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货