xml - 将属性添加到元素 xml
问题描述
我想向我的应答器 xml 添加属性。
set serveroutput on;
DECLARE
doc xmltype := xmltype(
'<workbook>
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>');
BEGIN
select updatexml(doc,'workbook','<workbook id="1"></workbook>') into doc from dual;
dbms_output.put_line(doc.getclobval());
END;
但如果我添加我不再有“工作表”标签。
你能帮助我吗 ?
解决方案
如果要向现有节点添加属性,而不是添加其他节点,可以使用insertchildxml
:
insertchildxml(doc, '/workbook', '@id', '1')
所以在你的代码中:
DECLARE
doc xmltype := xmltype(
'<workbook>
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>');
txt clob;
BEGIN
select insertchildxml(doc, '/workbook', '@id', '1') into doc from dual;
dbms_output.put_line(doc.getclobval());
END;
/
<workbook id="1"><worksheet sheetName="MySheet1" sheetId="1"/><worksheet sheetName="MySheet2" sheetId="2"/><worksheet sheetName="MySheet3" sheetId="3"/></workbook>
PL/SQL procedure successfully completed.
或为可读性而格式化:
DECLARE
doc xmltype := xmltype(
'<workbook>
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>');
txt clob;
BEGIN
select insertchildxml(doc, '/workbook', '@id', '1') into doc from dual;
select xmlserialize(document doc indent size=2) into txt from dual;
dbms_output.put_line(txt);
END;
/
<workbook id="1">
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>
PL/SQL procedure successfully completed.
但是insertchildxml
已弃用(原样appendchildxml
),因此您可以使用 XMLQuery 来代替:
xmlquery('copy $out := $in modify
( insert node attribute id {"1"} into $out/workbook )
return $out'
passing doc as "in" returning content)
再次在您的代码中并格式化以供显示:
DECLARE
doc xmltype := xmltype(
'<workbook>
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>');
txt clob;
BEGIN
select xmlquery('copy $out := $in modify
( insert node attribute id {"1"} into $out/workbook )
return $out'
passing doc as "in" returning content)
into doc from dual;
select xmlserialize(document doc indent size=2) into txt from dual;
dbms_output.put_line(txt);
END;
/
<workbook id="1">
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>
PL/SQL procedure successfully completed.
您还可以将属性值传递给 XPath:
DECLARE
doc xmltype := xmltype(
'<workbook>
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>');
txt clob;
BEGIN
select xmlquery('copy $out := $in modify
( insert node attribute id {$id} into $out/workbook )
return $out'
passing doc as "in", 42 as "id" returning content)
into doc from dual;
select xmlserialize(document doc indent size=2) into txt from dual;
dbms_output.put_line(txt);
END;
/
<workbook id="42">
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>
PL/SQL procedure successfully completed.
如果您想添加命名空间作为属性,您可以执行以下操作:
DECLARE
doc xmltype := xmltype(
'<workbook>
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>');
txt clob;
BEGIN
select xmlquery('copy $out := $in modify
( insert node attribute {concat("xmlns:", $id)} {$path} into $out/workbook )
return $out'
passing doc as "in", 'ns' as "id", 'http://example.com' as "path" returning content)
into doc from dual;
select xmlserialize(document doc indent size=2) into txt from dual;
dbms_output.put_line(txt);
END;
/
<workbook xmlns:ns="http://example.com" xmlns:xmlns="http://www.w3.org/2000/xmlns/">
<worksheet sheetName="MySheet1" sheetId="1"/>
<worksheet sheetName="MySheet2" sheetId="2"/>
<worksheet sheetName="MySheet3" sheetId="3"/>
</workbook>
PL/SQL procedure successfully completed.
但是由于您的节点没有名称空间,这似乎有点毫无意义。
推荐阅读
- javascript - 根据查看的设备更改文本?
- linux - 为什么 find 的 -exec 选项包含“不匹配”项目?
- jsf - 如何使 p:selectOneMenu 的特定 selectItem 成为必需?
- javascript - 带有多个单词的命令的 Javascript Discord 机器人
- python - 从字符串中检测和删除子字符串
- node.js - 用玩笑模拟自定义事件发射器
- javascript - 网页抓取,我无法选择我想要的标签
- asp.net-web-api - 为什么当我发布到服务器时 NSwag/Swagger 方案设置为仅 HTTP,但在我的本地计算机上它是 HTTPS?
- c - 部分定义的静态对象的未初始化成员是否保证初始化为 0?
- visual-studio - 有没有办法在 Visual Studio 的文件中显示搜索的“[当前] of [tota]”