Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Ошибка XML парсера. Баг в Oracle 11?  [new]
Yutikom
Member

Откуда:
Сообщений: 2
Товарищи! Столкнулся с такой вот проблемой. При парсинге CLOBa в XMLTYPE на Oracle 11.2.0.2.0 возникает ошибка:
ORA-31011: XML parsing failed
ORA-19202: Error occurred in XML processing
LPX-00103: Warning: document structure does not match DTD
Error at line 54
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 76

Код:
declare 
  xml_clob clob;  
  xml xmltype;
begin
  xml_clob:='<?xml version="1.0" encoding="UTF-8" ?><!-- <?xml version="1.0" encoding="WINDOWS-1251" ?> -->
<!DOCTYPE transport-file [
<!ELEMENT transport-file (file-meta-data, report)>
<!ELEMENT file-meta-data (file-name, file-date, file-time, id-key, file-signature)>
<!ELEMENT file-name (#PCDATA)>
<!ELEMENT file-date (#PCDATA)>
<!ELEMENT file-time (#PCDATA)>
<!ELEMENT id-key (#PCDATA)>
<!ELEMENT file-signature (#PCDATA)>
<!ELEMENT report (input-file-meta-data,file-error-status, file-error, ustanova, department?)>
<!ELEMENT input-file-meta-data (input-file-name, input-file-date, input-file-time, input-id-key, input-file-signature)>
<!ELEMENT input-file-name (#PCDATA)>
<!ELEMENT input-file-date (#PCDATA)>
<!ELEMENT input-file-time (#PCDATA)>
<!ELEMENT input-id-key (#PCDATA)>
<!ELEMENT input-file-signature (#PCDATA)>
<!ELEMENT file-error-status (#PCDATA)>
<!ELEMENT file-error (error)>
<!ELEMENT error (error-code, description?, start-tag-order?, remark?, additional-info)>
<!ELEMENT error-code (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT start-tag-order (#PCDATA)>
<!ELEMENT remark (#PCDATA)>
<!ELEMENT additional-info (key?, value?)>
<!ELEMENT key (#PCDATA)>
<!ELEMENT value (#PCDATA)>
<!ELEMENT ustanova (subj-id, subj-mfo, id-key-bank, id-key-ddfm?)>
<!ELEMENT department (subj-id?, subj-mfo?, id-key-bank?, id-key-ddfm?)>
<!ELEMENT subj-id (#PCDATA)>
<!ELEMENT subj-mfo (#PCDATA)>
<!ELEMENT id-key-bank (#PCDATA)>
<!ELEMENT id-key-ddfm (#PCDATA)>]>
<transport-file>
  <file-meta-data>
    <file-name>XV0UIF4A.301</file-name>
    <file-date>20130410</file-date>
    <file-time>1255</file-time>
    <id-key>0QMX00</id-key>
    <file-signature>7505EEE600E1BC2FCA020922BB9CB0BAF0FB81F2A160D1AF51ADAB0CA03FAA3BFF76954FDDB3850400A7DF4982CC2A2F0AE4D413CA4AC009BD1601D2DE934BD7</file-signature>
  </file-meta-data>
  <report>
    <input-file-meta-data>
      <input-file-name>XU0UIF4A.301</input-file-name>
                        <input-file-date>20130410</input-file-date>
                        <input-file-time>1249</input-file-time>
                        <input-id-key>UIFXX1</input-id-key>
                        <input-file-signature>5132633968F19A613AD178B3848BC753BC82ADB69622A570C1BBDDC692CAEF9A11CD0907850F7F0E324C7999C07EC154EB2505C00A1D7E1EDAFA62BDD8241D3F</input-file-signature>
    </input-file-meta-data>
          <file-error-status>0000</file-error-status>      
    <file-error>
      <error>
        <error-code>0000</error-code>
        <additional-info> 
        </additional-info>
      </error>
    </file-error>
    <ustanova>
            <subj-id>12345678</subj-id>
            <subj-mfo>123456</subj-mfo>
            <id-key-bank>12320812345678000000</id-key-bank>            
      <id-key-ddfm>123456</id-key-ddfm>
           </ustanova>
        <department>
            <subj-id>29375946</subj-id>
            <subj-mfo>987654</subj-mfo>
            <id-key-bank>12356789012776000000</id-key-bank>
			<id-key-ddfm>123456</id-key-ddfm>
                </department>		
	</report>
</transport-file>';

xml:=xmltype(xml_clob);
end;

Ошибка возникает в следующем месте:
<additional-info> 
</additional-info>

Если же записать текст в одну строчку, без пробелов, то все в порядке:
<additional-info></additional-info>


Проблема возникает именно на Oracle 11, на Oracle 9 такой проблемы нет. Да и вообще, любой парсер воспринимает данный XML нормально. Грешу на баг в парсере Oracle 11.

Кто нибудь сталкивался с такой проблемой? Можно ли ее как нибудь решить стандартными средствами Oracle? Может патч какой нибудь нужно поставить?
Предварительно убирать возвраты каретки и лишние пробелы из CLOBa вручную не хотелось бы...

Буду благодарен за любую помощь и информацию.
28 окт 13, 13:56    [15041133]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка XML парсера. Баг в Oracle 11?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Yutikom,

оч. похоже на баг.
баг из разряда пугливых - прячется при множестве способов переписать тоё чутка по другому.
например
 
'..
       <additional-info>
          <key>
          
          </key>
        </additional-info>
..'

или
 
'..
        <additional-info>

          <key/>
          

        </additional-info>
..'

и т.п.

а ещё - он повторяется на 12с.1
28 окт 13, 15:35    [15041772]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка XML парсера. Баг в Oracle 11?  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
А баг ли это?

LPX-00103: Warning: document structure does not match DTD

DTD - Elements

Тут скорее вопрос к реализации валидации по DTD.
28 окт 13, 15:59    [15041907]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка XML парсера. Баг в Oracle 11?  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
Предположу, что перенос строки воспринимается как значение элемента additional-info, который по dtd является контейнером для key,value.

Тэг <additional-info/> в таком варианте должен пройти спокойно.
28 окт 13, 16:02    [15041930]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка XML парсера. Баг в Oracle 11?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
env
Предположу, что перенос строки воспринимается как значение элемента additional-info, который по dtd является контейнером для key,value.

Тэг <additional-info/> в таком варианте должен пройти спокойно.

всё так. разумеется, <additional-info/> проходит.
а весь эффект и состоит в (имхо) неадекватной строгости разбора представленного автором синтаксиса пустого контейнера.
28 окт 13, 16:18    [15042017]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка XML парсера. Баг в Oracle 11?  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727

Oracle® Database Error Messages
11g Release 2 (11.2)
LPX-00103: document structure does not match DTD
Cause: Validity Constraint 3 failed: "An element is valid if there is a declaration matching elementdecl where the Name matches the element type, and one of the following holds:
* The declaration matches EMPTY and the element has no content

* The declaration matches children and the sequence of child elements belongs to the language generated by the regular expression in the content model, with optional white space (characters matching the nonterminal S) between each pair of child elements.

* The declaration matches Mixed and the content consists of character data and child elements whose types match names in the content model.

* The declaration matches ANY, and the types of any child elements have been declared."

Action: Correct the document.




orawish,

Видимо, грабли реализации.
28 окт 13, 16:32    [15042088]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка XML парсера. Баг в Oracle 11?  [new]
Yutikom
Member

Откуда:
Сообщений: 2
Всем спасибо за ответы! Проблему прошлось решать предварительной обработки CLOBa. Строки вида:
<additional-info> 
</additional-info>

преобразуются в
<additional-info></additional-info>

Только после этого происходит парсинг. К сожалению других решений не удалось найти.
12 дек 13, 17:40    [15284070]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка XML парсера. Баг в Oracle 11?  [new]
-2-
Member

Откуда:
Сообщений: 15330
Yutikom
Строки вида:
<additional-info> 
</additional-info>
dump("Строки вида", 1016)
12 дек 13, 18:09    [15284242]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить