对 Oracle 查询中的 XML 字符串进行编码

发布于 2024-08-09 03:05:28 字数 401 浏览 5 评论 0原文

我直接从 Oracle 中的 PL/SQL 生成 XML。

在特殊字符和字符编码方面,确保输出字符串符合 XML 的首选方法是什么?

大多数XML文件是静态的,我们只需要输出少数字段的数据。

我认为不好的做法示例:

DECLARE @s AS NVARCHAR(100)
SELECT  @s = 'Test chars = (<>, æøåÆØÅ)'

SELECT  '<?xml version="1.0" encoding="UTF-8"?>'
      + '<root><foo>'
      + @s
      + '</foo></root>' AS XML

I'm producing XML right from PL/SQL in Oracle.

What is the preferred way of ensuring that outputted strings are XML-conformant, with regards to special characters and character encoding ?

Most of the XML file is static, we only need to output data for a few fields.

Example of what I consider bad practice:

DECLARE @s AS NVARCHAR(100)
SELECT  @s = 'Test chars = (<>, æøåÆØÅ)'

SELECT  '<?xml version="1.0" encoding="UTF-8"?>'
      + '<root><foo>'
      + @s
      + '</foo></root>' AS XML

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

静谧幽蓝 2024-08-16 03:05:28

我发现有两种生成 XML 的好方法。其中之一是 SYS.XMLDOM 包,它本质上是 Java DOM API 的包装器。它有点笨重,因为 pl/sql 不具有 Java 的多态功能,因此您必须不断地显式地将元素“转换”为节点,反之亦然才能使用包中的方法。

在我看来,最酷的技术是使用 XMLElement 等 SQL 函数,如下所示:

SET SERVEROUTPUT ON SIZE 1000000;
DECLARE

    v_xml XMLTYPE;

BEGIN

    SELECT
        XMLElement( "dual",
            XMLAttributes( dual.dummy AS "dummy" )
        )
    INTO
        v_xml
    FROM
        dual;

    dbms_output.put_line( v_xml.getStringVal() );

END;
/

如果您的 XML 结构不是很复杂并且可以轻松映射到表结构,那么这会非常方便。

There are two good ways to generate XML that I've found. One is the SYS.XMLDOM package which is essentially a wrapper around the Java DOM API. It's somewhat clunky because pl/sql doesn't have the polymorphic capabilities of Java, so you constantly have to explicitly "cast" elements to nodes and vice versa to use the methods in the package.

The coolest, IMO, technique is to use the XMLElement, etc, SQL functions like this:

SET SERVEROUTPUT ON SIZE 1000000;
DECLARE

    v_xml XMLTYPE;

BEGIN

    SELECT
        XMLElement( "dual",
            XMLAttributes( dual.dummy AS "dummy" )
        )
    INTO
        v_xml
    FROM
        dual;

    dbms_output.put_line( v_xml.getStringVal() );

END;
/

If your XML structure is not very complex and maps easily to your table structure then this can be very handy.

无边思念无边月 2024-08-16 03:05:28

使用 XmlElement、XmlAttribute...是生成 xml 的最佳方式。
以下链接对所有功能进行了很好的介绍:
http://download.oracle.com/ docs/cd/B19306_01/appdev.102/b14259/xdb13gen.htm#ADXDB1620

如果您寻找更多方法,请查看此处
http://download.oracle.com/ docs/cd/B19306_01/appdev.102/b14259/xdb13gen.htm#sthref1486

编码的内容。如果您在客户端会话中运行 pl/sql 程序或选择生成 xml。 xml 使用客户端代码页进行编码。如果您在后台作业中运行它(使用 dbms_job 或 dbms_scheduler),它将使用数据库代码页进行编码。

Using XmlElement, XmlAttribute, ... is the best way to generate xml.
The following link gives a good intro in all functions there are:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14259/xdb13gen.htm#ADXDB1620

If you look for some more ways, look at here
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14259/xdb13gen.htm#sthref1486

Whatchout for the encoding. If you run a pl/sql programm or a select generating xml in a client session. The xml is encoded with client codepage. If you run it in background job (using dbms_job or dbms_scheduler) it is encoded with database codepage.

浅忆流年 2024-08-16 03:05:28
select dbms_xmlgen.getXML('select * from yourtable');
select dbms_xmlgen.getXML('select * from yourtable');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文