我需要使用包 dbms_xmldom 修改 XML 如下:
- 如果属性的值只有数字,那么这个属性被移除
- 如果不只是数字,则驱动为大写
- 如果经过修改或最初没有标签属性,则应将其删除
- 在根标签必须添加标签
<MODIFICATIONS nums="" chars="" del_tags=""/>
在哪里
- nums用数字指定删除属性的个数
- chars指定具有非数字的属性的数量,它们被赋予大写
- del_tags - 远程标签的数量
也就是说,例如,应该是这样的: XML 输入
<? xml version = "1 .0" encoding ="windows-1251" standalone ="yes"?>
<ROOT a="000" b="aacckf" d="75" f="69">
<SEAL c="12"/>
</ROOT>
我们必须删除属性 a = "000", d="75", f="69", c = "12" 和属性 b = "aacckf" 更改为 b = "AACCKF" 并删除标签:
<? xml version = "1 .0" encoding ="windows-1251" standalone ="yes"?>
<ROOT b="AACCKF">
<MODIFICATIONS nums="4" chars="1" del_tags="1"/>
</ROOT>
我用这个
drop table xmldom_table;
create table xmldom_table(
num_id integer,
before_xml clob,
after_xml clob
);
insert into xmldom_table
( num_id, before_xml )
values
(1, '<? xml version = "1 .0" encoding ="windows-1251" standalone ="yes"?>
<ROOT a="000" b="aacckf" d="75" f="69">
<SEAL c="12"/>
</ROOT>');
create or replace function isnumber( p_string in varchar2 ) return boolean
is
not_number exception;
pragma exception_init( not_number, -6502 );
l_number number;
l_return boolean := FALSE;
begin
if (instr(p_string,',') > 0 )
then
l_number := to_number( p_string, '999g999g999g999g999g999d999999999999999999' );
else
l_number := to_number( p_string );
end if;
return TRUE;
exception
when not_number
then
return FALSE;
end;
这是我发现并修改并坚持的
DECLARE
g_doc dbms_xmldom.DOMDocument; -- basic DOM-document
g_node dbms_xmldom.DOMNode;
new_node dbms_xmldom.DOMNode;
new_el dbms_xmldom.DOMElement;
g_nlist dbms_xmldom.DOMNodeList; -- list of child nodes
g_clob clob;
g_cnum integer default 0;
g_cchar integer default 0;
g_cdeltags integer default 0;
-- The procedure for withdrawal of the attributes of a node
procedure show_node_attributes (p_node in dbms_xmldom.DOMNode)
is
l_nattrs dbms_xmldom.DOMNamedNodeMap; -- the list of attributes node
l_node dbms_xmldom.DOMNode; -- the type of node - the attribute
elem dbms_xmldom.DOMElement;
tmp_Attr dbms_xmldom.DOMAttr;
l_sattrs varchar2 (2000) -- Name of the attribute
l_vattrs varchar2 (2000) -- the value of the attribute
begin
-- Get the attributes of a node
elem: = dbms_xmldom.makeElement (p_node);
l_nattrs: = dbms_xmldom.GetAttributes (p_node);
-- Display the names of the attributes and their values on one line
if not dbms_xmldom.isNull (l_nattrs) then
dbms_output.put_line ('length' | | dbms_xmldom.GetLength (l_nattrs));
for i in 0 .. dbms_xmldom.GetLength (l_nattrs) -1 loop
l_node: = dbms_xmldom.item (l_nattrs, i);
l_sattrs: = dbms_xmldom.GetNodeName (l_node);
l_vattrs: = dbms_xmldom.GetNodeValue (l_node);
dbms_output.put_line ('before value:' | | i | | '' | | l_sattrs | | '' | | l_vattrs | | '' | | dbms_xmldom.getNodeType (l_node));
if (isnumber (l_vattrs)) then
dbms_output.put_line ('value:' | | l_sattrs | | '' | | l_vattrs);
-- Dbms_xmldom. SetNodeValue (l_node,'');
tmp_Attr: = dbms_xmldom.getAttributeNode (elem, l_sattrs);
tmp_Attr: = dbms_xmldom.removeAttributeNode (elem, tmp_Attr);
dbms_output.put_line ('deleted length' | | dbms_xmldom.GetLength (l_nattrs));
g_cnum: = g_cnum + 1;
else
dbms_xmldom.setNodeValue (l_node, upper (l_vattrs));
g_cchar: = g_cchar + 1;
end if;
end loop;
-- Dbms_output. Put_line ('attrs:' | | l_sattrs);
END IF;
END;
-- A recursive procedure for constructing the DOM tree of the document
procedure recursive_tree (p_node in dbms_xmldom.DOMNode)
is
l_nlist dbms_xmldom.DOMNodeList; -- list of child nodes
l_node dbms_xmldom.DOMNode; -- the current node
l_nval varchar2 (2000) -- the value of the node
begin
-- Open the node description
-- Dbms_output.put_line ('start:' | | dbms_xmldom.getNodeName (p_node));
/ *
-- If the value of the node NULL, skip it
l_nval: = dbms_xmldom.getNodeValue (p_node);
if l_nval is not null then
dbms_output.put_line ('value:' | | l_nval);
end if;
-- * /
-- Display the attributes of a node
show_node_attributes (p_node);
-- For the child node a node considered in the current
l_nlist: = dbms_xmldom.getChildNodes (p_node);
-- Repeat the steps you
if not dbms_xmldom.isNull (l_nlist) then
for i in 0 .. dbms_xmldom.getLength (l_nlist) -1 loop
l_node: = dbms_xmldom.item (l_nlist, i);
recursive_tree (l_node);
end loop;
end if;
-- Remove the empty sites
if (1 = 2) then
g_cdeltags: = g_cdeltags + 1;
end if;
-- Close the node description
-- Dbms_output.put_line ('Endof:' | | DBMS_XMLDOM.getNodeName (p_node));
END;
BEGIN
-- Building a tree
select x.before_xml into g_clob from xmldom_table x where x.num_id = 1;
g_doc: = dbms_xmldom.newDOMDocument (g_clob);
g_node: = dbms_xmldom.makeNode (g_doc);
recursive_tree (g_node);
g_nlist: = dbms_xmldom.getElementsByTagName (g_doc, 'DOC');
g_node: = dbms_xmldom.item (g_nlist, 0);
new_el: = dbms_xmldom.createElement (g_doc, 'MODIFICATIONS');
dbms_xmldom.setAttribute (new_el, 'nums', g_cnum);
dbms_xmldom.setAttribute (new_el, 'chars', g_cchar);
dbms_xmldom.setAttribute (new_el, 'del_tags', g_cdeltags);
g_node: = dbms_xmldom.appendChild (g_node, dbms_xmldom.makeNode (new_el));
dbms_xmldom.writeToClob (g_doc, g_clob);
update xmldom_table x set x.after_xml = g_clob where x.num_id = 1;
END;