关于 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="&#163;"/>
我需要的输出是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<coreProperties myAttribute="£"/>
换句话说,我想防止输入数据中的
&
(输入到属性值中)通过函数&
转义到setAttribute()
。 可以吗?
我应该补充一点,如果这是输入到元素中的数据,我可以对其进行 CDATA。 但我相信这不能在属性中完成。
部分答案(解决了
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('£é&');
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="£é&"/>
将
£
输出为 £
,将 é
输出为 é
,因为它们不需要转义,将 &
输出为 &
,因为它实际上需要转义。
但是,这并不能完全达到您的预期输出 - 但它确实用稍微不同的解决方案解决了您想要解决的问题。