防止 Oracle Dbms_XmlDom 转义属性

问题描述 投票:0回答:1

关于 Oracle

Dbms_XmlDom
功能的另一个问题。 这次是关于设置属性。 这是代码:

DECLARE
   doc_   dbms_XmlDom.DomDocument := Dbms_XmlDom.newDomDocument;
   nd_    dbms_XmlDom.DomNode;
   tag_   dbms_XmlDom.DomElement;
   data_in_ VARCHAR2(50) := '£';
   out_   VARCHAR2(32000);
BEGIN
   Dbms_XmlDom.setVersion (doc_, '1.0" encoding="UTF-8" standalone="yes');
   tag_ := Dbms_XmlDom.createElement (
      doc     => doc_,
      tagName => 'coreProperties'
   );
   Dbms_XmlDom.setAttribute(tag_, 'myAttribute', data_in_);
   nd_  := Dbms_XmlDom.appendChild (Dbms_XmlDom.makeNode(doc_), Dbms_XmlDom.makeNode(tag_));

   out_ := Dbms_XmlDom.getXmlType(doc_).getClobVal;
   Dbms_XmlDom.freeDocument (doc_);
   Dbms_Output.Put_Line (out_);
END;

这是输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<coreProperties myAttribute="&amp;#163;"/>

我需要的输出是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<coreProperties myAttribute="&#163;"/>

换句话说,我想防止输入数据中的

&
(输入到属性值中)通过函数
&amp;
转义到
setAttribute()
。 可以吗?

我应该补充一点,如果这是输入到元素中的数据,我可以对其进行 CDATA。 但我相信这不能在属性中完成。

xml oracle plsql
1个回答
0
投票

部分答案(解决了

DBMS_XMLDOM
在已经转义的字符中转义&符号的问题)是转义 HTML 代码,然后让
DBMS_XMLDOM.SETATTRIBUTE
仅转义那些实际需要转义的字符:

DECLARE
   doc_   dbms_XmlDom.DomDocument := Dbms_XmlDom.newDomDocument;
   nd_    dbms_XmlDom.DomNode;
   tag_   dbms_XmlDom.DomElement;
   data_in_ VARCHAR2(50) := UTL_I18N.unescape_reference('&#163;&eacute;&amp;');
   out_   VARCHAR2(32000);
BEGIN
   Dbms_XmlDom.setVersion (doc_, '1.0" encoding="UTF-8" standalone="yes');
   tag_ := Dbms_XmlDom.createElement (
      doc     => doc_,
      tagName => 'coreProperties'
   );
   Dbms_XmlDom.setAttribute(tag_, 'myAttribute', data_in_);
   nd_  := Dbms_XmlDom.appendChild (Dbms_XmlDom.makeNode(doc_), Dbms_XmlDom.makeNode(tag_));

   out_ := Dbms_XmlDom.getXmlType(doc_).getClobVal;
   Dbms_XmlDom.freeDocument (doc_);
   Dbms_Output.Put_Line (out_);
END;
/

输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<coreProperties myAttribute="£é&amp;"/>

&#163;
输出为
£
,将
&eacute;
输出为
é
,因为它们不需要转义,将
&amp;
输出为
&amp;
,因为它实际上需要转义。

但是,这并不能完全达到您的预期输出 - 但它确实用稍微不同的解决方案解决了您想要解决的问题。

© www.soinside.com 2019 - 2024. All rights reserved.