Я хочу десериализовать следующую структуру 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;