У меня проблема с обновлением значений xmlType в oracle. мне нужно изменить XML ищет похожее на следующее:Как избежать специальных символов при обновлении XML в oracle SQL
<a>
<b>Something to change here</b>
<c>Here is some narrative containing weirdly escaped <tags>\</tags> </c>
</a>
То, что я хочу добиться того, чтобы изменить < б /> без изменения < с />
К сожалению следующее modifyXml:
select
updatexml(XML_TO_MODIFY, '/a/b/text()', 'NewValue')
from dual;
возвращает это:
<a>
<b>NewValue</b>
<c>Here is some narrative containing weirdly escaped <tags></tags> </c>
</a>
, как вы можете видеть, «>» сбежал.
То же самое происходит на XMLQUERY (новый, не осуждается версия updateXml):
select /*+ no_xml_query_rewrite */
xmlquery(
'copy $d := .
modify (
for $i in $d/a
return replace value of node $i/b with ''nana''
)
return $d'
passing t.xml_data
returning content
) as updated_doc
from (select xmlType('<a>
<b>Something to change here</b>
<c>Here is some narrative containing weirdly escaped \<tags>\</tags> </c>
</a>') as xml_data from dual) t
;
Также при использовании xmlTransform я получить тот же результат. Я пытался использовать
disable-output-escaping="yes"
Но это сделал наоборот - он незаменяемые в & лт; :
select XMLTransform(
xmlType('<a>
<b>Something to change here</b>
<c>Here is some narrative containing weirdly escaped \<tags>\</tags> </c>
</a>'),
XMLType(
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="https://stackoverflow.com/a/b">
<b>
<xsl:value-of select="text()"/>
</b>
</xsl:template>
<xsl:template match="https://stackoverflow.com/a/c">
<c>
<xsl:value-of select="text()" disable-output-escaping="yes"/>
</c>
</xsl:template>
</xsl:stylesheet>'))
from dual;
вернулся:
<a>
<b>NewValue</b>
<c>Here is some narrative containing weirdly escaped <tags></tags> </c>
</a>
Есть предложения? Две вещи, которые вы должны знать:
- Я не могу изменить первоначальный формат - он приходит ко мне на этом пути и мне нужно, чтобы сохранить его.
- Исходное сообщение настолько велико, что изменение сообщение в строку и обратно (для использования регулярных выражений как обходное решение) будет не делать трюк.
Риск звучать глупо: почему это проблема для вас, что персонажи избегают? Никакой соответствующий XML-процессор не может жаловаться, что '>' представляется как '>' - действительно, если вы фактически не сравниваете строки, образующие разметку, нет никакого способа сказать разницу. Есть ли вероятность, что это просто не проблема? –
К сожалению, нам нужно уменьшить изменения до минимума, так как этот xml получается из внешней системы и используется для согласования с этой системой. Если есть изменения, они жалуются, что сообщение отличается и говорят, что они никогда не отправляли ничего подобного. Причина в том, что я, очевидно, уже меняю сообщение, но это значит, что повторное опосредствование ошибки, которая создала изменение в первую очередь (сохранение таких xml-адресов не является проблемой, обновление - это). –
Являются ли ваши исходные данные фактически 'XMLType' или это' CLOB'? В последнем случае вы можете уйти с помощью 'DBMS_LOB', чтобы изменить значение без штрафа (хотя это будет нелегко). –