PL / SQL XML в тип объекта с атрибутами и текстом () - PullRequest
2 голосов
/ 25 марта 2019

Я хочу десериализовать следующую структуру XML в тип объекта PL / SQL:

<ProcessingInfo>
     <MrwNumber>000001</MrwNumber>
     <Station SerialNumber="nice-Attribute">Hello</Station>
</ProcessingInfo>

Что особенного в этом XML: элемент <Station> имеет атрибут SerialNumber и фактический текст() значение Hello.

Как определить типы для десериализации XML в типы объектов?

Для структуры XML я определил следующие типы:

CREATE OR REPLACE TYPE station_t FORCE AS OBJECT (
     "@SerialNumber"   VARCHAR2(100 CHAR)
);
CREATE OR REPLACE TYPE processingInfo_t FORCE AS OBJECT (
     "MrwNumber"                  VARCHAR2(255)
   , "Station"                    station_t
);

Это моя логика выполнения:

DECLARE
        l_obj processingInfo_t;
        l_xml XMLTYPE;
BEGIN
        l_xml :=  xmltype(
        '<ProcessingInfo>
            <MrwNumber>000001</MrwNumber>
            <Station SerialNumber="nice-Attribute">Hello</Station>
        </ProcessingInfo>');

        l_xml.toObject(l_obj);
END;

И ошибка:

ORA-19031: XML element or attribute text does not match any in type DEMOGRAPHIC.STATION_T
ORA-06512: at "SYS.XMLTYPE", line 196
ORA-06512: at line 11
19031. 00000 -  "XML element or attribute %s does not match any in type %s.%s"
*Cause:    The passed in XML tag does not match any in the object type
*Action:   Pass a valid canonical XML that can map to the given object type

Я знаю, что в объекте station_t чего-то не хватает,поскольку будет предоставлен фактический текст (), но он не определен в типе.Но я понял это.

Другой вопрос, как я могу получить доступ к значению атрибута, когда сериализация успешно произошла на уровне объекта?

Дополнительно: когда я удаляю текст () = Hello из <Station>, кажется, что сериализация работает:

DECLARE
        l_obj processingInfo_t;
        l_xml XMLTYPE;
BEGIN
        l_xml :=  xmltype(
        '<ProcessingInfo>
            <MrwNumber>000001</MrwNumber>
            <Station SerialNumber="nice-Attribute"></Station>
        </ProcessingInfo>');

        l_xml.toObject(l_obj);
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...