我在更新放置在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; <
&#39;和&#39; >
&#39;。我无法在XMLTYPE中封装CDATA:XMLTYPE('<![CDATA[...]]>
),因为我收到错误。
我可以使用已弃用的函数UPDATEXML()
,但我需要XPath 1.0中不支持的upper-case()
函数,并且translate()
方法很难看,我不会这样做我知道如何在这种情况下使用它。当然,我无法保证不会翻译&lt; &GT;到<
>
。
你知道如何帮我解决问题吗?
好的,我使用了UPDATEXML()
功能,对我有用。它不会改变&lt; &GT;到<
>
,但不支持任何upper-case()
函数(仅translate()
)。但我有能力稍微重建我的程序,现在,我不必进行字符串比较。
但是,这不是问题的答案,所以我将其保留为未解决的问题。
答案 0 :(得分:2)
CDATA不会替换任何内容。它只是一个XML构造,可以让您编写纯文本,而无需转义标记。这只是语法糖,并且总是等同于将其内容作为文本写入并进行适当的转义。例如:
<p><![CDATA[Use <p>Hello.</p> to write a paragraph.]]></p>
总是等同于:
<p>Use <p>Hello.</p> to write a paragraph.</p>
当您手动编写包含大量标记的XML文档(如文章)时(例如关于XML的文章,包含文本中的XML示例),这有时很有用。
解析后,CDATA不会被记录下来#34;以任何方式。一旦传递给XQuery,上面的两个例子都会产生完全相同的结果(如果文本被复制到输出中,很可能包含<
个转义字符。