Как получить значение амперсанда внутри XMLTYPE - PullRequest
0 голосов
/ 19 марта 2019

У меня есть запрос ниже:

select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1v2</val>
  </TPL>
</root>') from dual;

Когда я выполняю вышеуказанный запрос, он выполняется отлично, и я получаю следующий вывод:

<root>
  <TPL>
    <fld>f7</fld><val>v1v2</val>
  </TPL>
</root>

Но когда я выполняю следующее (что является моим требованием):

select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1&v2</val>
  </TPL>
</root>') from dual;

Меня просят ввести значение '&' во всплывающем окне.

Я пробовал следующие два способа:

select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1&amp;v2</val>
  </TPL>
</root>') from dual;


select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1''&''v2</val>
  </TPL>
</root>') from dual;

Но все еще не может правильно получить ВЫХОД, который должен быть:

<root>
  <TPL>
    <fld>f7</fld><val>v1&v2</val>
  </TPL>
</root>

Как мне этого добиться?

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Здесь есть две проблемы - & - это специальный символ в и Oracle SQL и XML, и он должен быть экранирован в обоих.cdb_dba привел несколько примеров того, как избежать этого в SQL (CHR(38) или & в конце строки), а mkuligowski привел примеры того, как избежать этого в XML (&amp; или CDATA), но два вида экранированиянужно сочетать.Вот пара примеров:

-- with CHR() + CDATA
select XMLType('<root>
  <TPL>
    <fld>f7</fld><val><![CDATA[v1'|| chr(38) || 'v2]]></val>
  </TPL>
</root>') from dual;

-- with ampersand at the end of a string + "amp" character reference 
select XMLType('<root>
  <TPL>
    <fld>f7</fld><val>v1&' || 'amp;v2</val>
  </TPL>
</root>') from dual;
0 голосов
/ 19 марта 2019

Могу поспорить, что вы используете SQLDeveloper при запросах.Попробуйте запустить SET DEFINE OFF;, и вам не будет предложено ввести значение.

Более того, когда вы создаете объект XMLType, вы должны экранировать недопустимые символы, поэтому будет работать следующее:

SET DEFINE OFF;
select XMLType('<root>
 <TPL>
  <fld>f7</fld><val>v1&amp;v2</val>
 </TPL>
 </root>') from dual;

С другой стороны, вы всегда можете заключить недопустимый символ в CDATA:

select XMLType('<root>
 <TPL>
  <fld>f7</fld><val><![CDATA[v1&v2]]></val>
 </TPL>
</root>') from dual;
0 голосов
/ 19 марта 2019

Вместо использования v1''&''v2 или v1&amp;v2, попробуйте использовать v1'|| chr(38) || 'v2 или 'v1 &'||'v2'

chr (38) - это ASCII для амперстака, а второй вариант - это просто другой метод объединения. Надеюсь, это поможет!

...