XQuery更改<>到''和'>'在具有CDATA的更新节点期间

时间:2015-05-25 08:14:04

标签: xml oracle xpath xquery

我在更新放置在oracle数据库中的大型XML文件时遇到了问题。

这个XML描述了数据库结构,我必须更新许多节点。 当我不得不用<![CDATA[...]]>更新节点时,我遇到了这个问题。 我常用的查询,如下所示:

 UPDATE XML_TABLE set XML_TABLE.xml =
  (select XMLQuery('copy $tmp := . modify
     (for $i in $tmp/MODEL/ERD/ENTITIES/ENTITY[upper-case(NAME) = "SOME_TABLE"]NOTES/text()  
      return replace value of node $i with $p0) 
            return $tmp'
           PASSING x.xml, '<![CDATA[ new text value ]]>' as "p0" RETURNING CONTENT) FROM XML_TABLE x )

我之所以选择这种查询,是因为我可以让它一次更新多个节点:

select xmlquery(' copy $tmp := . modify 
                  ((for $j in $tmp/MOD (...)return insert node $p1 as last into $j),
                   (for $j in $tmp/MODEL(...)return insert node $p2 as last into $j),
                   (for $j in $tmp/MODEL(...)return insert node $p3 as last into $j))
                   return $tmp'
                   passing x.xml, 'whatever1' as "p1",
                                  'something1' as "p2",
                                  'sth2' as "p3"                    
                   returning content
                   )
From XML_TABLE x

不幸的是,我无法使用<![CDATA[...]]>更新节点。 &#39;&lt;&#;和&#39;&gt;&#39;标志被替换为&#39; &lt;&#39;和&#39; &gt;&#39;。我无法在XMLTYPE中封装CDATA:XMLTYPE('<![CDATA[...]]>),因为我收到错误。

我可以使用已弃用的函数UPDATEXML(),但我需要XPath 1.0中不支持的upper-case()函数,并且translate()方法很难看,我不会这样做我知道如何在这种情况下使用它。当然,我无法保证不会翻译&lt; &GT;到&lt; &gt;

你知道如何帮我解决问题吗?

好的,我使用了UPDATEXML()功能,对我有用。它不会改变&lt; &GT;到&lt; &gt;,但不支持任何upper-case()函数(仅translate())。但我有能力稍微重建我的程序,现在,我不必进行字符串比较。 但是,这不是问题的答案,所以我将其保留为未解决的问题。

1 个答案:

答案 0 :(得分:2)

CDATA不会替换任何内容。它只是一个XML构造,可以让您编写纯文本,而无需转义标记。这只是语法糖,并且总是等同于将其内容作为文本写入并进行适当的转义。例如:

<p><![CDATA[Use <p>Hello.</p> to write a paragraph.]]></p>

总是等同于:

<p>Use &lt;p>Hello.&lt;/p> to write a paragraph.</p>

当您手动编写包含大量标记的XML文档(如文章)时(例如关于XML的文章,包含文本中的XML示例),这有时很有用。

解析后,CDATA不会被记录下来#34;以任何方式。一旦传递给XQuery,上面的两个例子都会产生完全相同的结果(如果文本被复制到输出中,很可能包含&lt;个转义字符。