Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг xml по заданной xsd-схеме / 4 сообщений из 4, страница 1 из 1
22.08.2017, 14:23
    #39508777
Idoh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг xml по заданной xsd-схеме
Всем привет. В теме парсинга я не очень, здесь нашел пример как распарсить xml-файл:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
--создаем таблицу
create table tmp_xml (xml XMLType);

--заполняем таблицу
insert into tmp_xml (xml) values (XMLType(
'<RESPONSE>
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_002">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="PASSP_NO" value="AAA012345678" />
      <ATTRIBUTE name="ISSUE_DATE" value="01.01.2000" />
    </ENTITY>
  </DATA>
</RESPONSE>'
));

--парсим даныне из таблицы
select p.id
     , max(p.person_surname) person_surname
     , max(p.passport_no) passport_no
     , max(p.passport_issue_date) passport_issue_date
from (select d.extract('//ENTITY//ATTRIBUTE[@name="PERS_ID"]/@value').getStringVal() id
           , d.extract('//ENTITY//ATTRIBUTE[@name="SURNAME"]/@value').getStringVal() person_surname
           , d.extract('//ENTITY//ATTRIBUTE[@name="PASSP_NO"]/@value').getStringVal() passport_no
           , d.extract('//ENTITY//ATTRIBUTE[@name="ISSUE_DATE"]/@value').getStringVal() passport_issue_date
      from tmp_xml t
         , table(XMLSequence(t.xml.extract('RESPONSE/DATA/ENTITY'))) d
     ) p
group by p.id;



А как сделать чтобы парсинг происходил по заданной xsd-схеме?
Первым делом я так понимаю надо схему зарегестрировать. Делаю так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
declare 
  xsdclob clob := '<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://localhost" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="RESPONSE">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="DATA">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ENTITY" maxOccurs="unbounded" minOccurs="0">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="ATTRIBUTE" maxOccurs="unbounded" minOccurs="0">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute type="xs:string" name="name" use="optional"/>
                            <xs:attribute type="xs:string" name="value" use="optional"/>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute type="xs:string" name="name" use="optional"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute type="xs:byte" name="REQUEST_ID"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>';
begin
  begin
    dbms_xmlschema.deleteschema('myxsd.xsd', 3); 
  exception
    when others then
      null;
  end;
  begin
    dbms_xmlschema.registerSchema('myxsd.xsd', xsdclob, local => true, genTypes => false, genbean => false, genTables => false);
  exception
    when others then
      null;
  end;
end;


А как ее далее подключить к проверке xml при разборе?
...
Рейтинг: 0 / 0
22.08.2017, 14:32
    #39508783
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг xml по заданной xsd-схеме
IdohА как ее далее подключить к проверке xml при разборе?Для проверки соответствия хмеля XSD-схеме у XML-типа есть методы isSchemaValid и schemaValidate.
...
Рейтинг: 0 / 0
22.08.2017, 14:34
    #39508785
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг xml по заданной xsd-схеме
Код: plsql
1.
genTypes => false

xmltype конструктор+xmltype toobject
...
Рейтинг: 0 / 0
22.08.2017, 15:18
    #39508803
Idoh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг xml по заданной xsd-схеме
Создал хранимую процедуру которая проверяет на валидность:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
create or replace procedure XML_FILE_VALIDATOR is

xml XMLType;

  xml_clob1 clob := '<?xml version="1.0" encoding="windows-1257" ?>
<RESPONSE xmlns="http://localhost"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://localhost myxsd1.xsd">
  <DATA REQUEST_ID="111">
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="1111" />
      <ATTRIBUTE name="FIRST_NAME" value="OLGA" />
      <ATTRIBUTE name="SURNAME" value="NOVIKOVA" />
    </ENTITY>
    <ENTITY name="PACKAGE_001">
      <ATTRIBUTE name="PERS_ID" value="2222" />
      <ATTRIBUTE name="FIRST_NAME" value="ANNA" />
      <ATTRIBUTE name="SURNAME" value="ANTONOVA" />
    </ENTITY>
  </DATA>
</RESPONSE>';
begin
 xml := xmltype(xml_clob1);


    if xml.isschemavalid('myxsd1.xsd')  = 1 then
    dbms_output.put_line ('XML document is VALID');

  else
    dbms_output.put_line ('XML document is INVALID => '||sqlerrm);

  end if;
end;


А как вместо "clob" передать на проверку ранее созданную таблицу tmp_xml ?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Парсинг xml по заданной xsd-схеме / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]