Желаю здравствовать всем!
Имею на входе одну XML, которую с помощью DBMS_XMLDOM парсю и записываю в таблицу. Возникла необходимость для каждой записи в таблице записывать еще в соответствующую колонку типа Clob отдельный блок c XML, который был распарсен. Соответственно возник вопрос как средствами DBMS_XMLDOM можно получить этот самый блок.
Пример того, что есть в упрощенной форме:
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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
declare
hDocument DBMS_XMLDOM.DOMDocument; --Документ с которым будем работать
hMainElement DBMS_XMLDOM.DOMElement; --Основной элемент документа
hRecMessages DBMS_XMLDOM.DOMNodeList; --Список нод по тегу Messages
nRecord DBMS_XMLDOM.DOMNode; --Одна конкретная нода
hSubRecList DBMS_XMLDOM.DOMNodeList; --Список поднод
nSubRecVal DBMS_XMLDOM.DOMNode; --Одна конкретная поднода Rec
hSubRecElement DBMS_XMLDOM.DOMElement; --Один конкретный элемент подноды Rec
xmlText xmltype;
begin
hDocument := dbms_xmldom.newDOMDocument(xmltype(
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetMessages1 xmlns="http://www.w3.org/2001/XMLSchema/"><GetMessages2>
<Messages>
<MessageData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Id>1665442</Id>
<Number>1665442</Number>
<Publisher xsi:type="Publisher">
<Name>Рога и копыта</Name>
<Ogrn>1127457000366</Ogrn>
<Inn>8457123362</Inn>
</Publisher>
<MessageInfo MessageType="CompletionOfExtra">
<CompletionOfExtra>
<Text>Процедура завершена.</Text>
<StartNumber>1441</StartNumber>
</CompletionOfExtra>
</MessageInfo>
</MessageData>
<MessageData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Id>1665443</Id>
<Number>1665443</Number>
<Publisher xsi:type="Publisher">
<Name>Рога</Name>
<Ogrn>1127457000377</Ogrn>
<Inn>8457123456</Inn>
</Publisher>
<MessageInfo MessageType="CompletionOfExtra">
<CompletionOfExtra>
<Text>Процедура завершена.</Text>
<StartNumber>1442</StartNumber>
</CompletionOfExtra>
</MessageInfo>
</MessageData>
<MessageData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Id>1665444</Id>
<Number>1665444</Number>
<Publisher xsi:type="Publisher">
<Name>Копыта</Name>
<Ogrn>1127457000388</Ogrn>
<Inn>8457345678</Inn>
</Publisher>
<MessageInfo MessageType="CompletionOfExtra">
<CompletionOfExtra>
<Text>Процедура завершена.</Text>
<StartNumber>1443</StartNumber>
</CompletionOfExtra>
</MessageInfo>Djn rfr
</MessageData>
</Messages></GetMessages2></GetMessages1></s:Body></s:Envelope>'));
hMainElement := DBMS_XMLDOM.GetDocumentElement(hDocument);
hRecMessages := DBMS_XMLDOM.GetElementsByTagName(hMainElement, 'MessageData');
if DBMS_XMLDOM.GetLength(hRecMessages) > 0 then
for z in 0..DBMS_XMLDOM.GetLength(hRecMessages)-1 loop -- по записям
nRecord := DBMS_XMLDOM.Item(hRecMessages, z);
hSubRecElement := DBMS_XMLDOM.MAKEELEMENT(nRecord);
hSubRecList := DBMS_XMLDOM.GetElementsByTagName(hSubRecElement,'*');
for i in 0..DBMS_XMLDOM.GetLength(hSubRecList)-1 loop
nSubRecVal := dbms_xmldom.item(hSubRecList,i);
dbms_output.put_line('Node name : "' || DBMS_XMLDOM.getNodeName(nSubRecVal) || '" value: ' || DBMS_XMLDOM.getNodeValue(DBMS_XMLDOM.getFirstChild(nSubRecVal)) ||'');
end loop;
--dbms_output.put_line( xmlText.getclobval() );
end loop;
end if;
end;
Соответственно для данного примера нужно получить 3 XML по тегу MessageData:
1-я XML
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<MessageData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Id>1665442</Id>
<Number>1665442</Number>
<Publisher xsi:type="Publisher">
<Name>Рога и копыта</Name>
<Ogrn>1127457000366</Ogrn>
<Inn>8457123362</Inn>
</Publisher>
<MessageInfo MessageType="CompletionOfExtra">
<CompletionOfExtra>
<Text>Процедура завершена.</Text>
<StartNumber>1441</StartNumber>
</CompletionOfExtra>
</MessageInfo>
</MessageData>
2-я XML
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<MessageData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Id>1665443</Id>
<Number>1665443</Number>
<Publisher xsi:type="Publisher">
<Name>Рога</Name>
<Ogrn>1127457000377</Ogrn>
<Inn>8457123456</Inn>
</Publisher>
<MessageInfo MessageType="CompletionOfExtra">
<CompletionOfExtra>
<Text>Процедура завершена.</Text>
<StartNumber>1442</StartNumber>
</CompletionOfExtra>
</MessageInfo>
</MessageData>
3-я XML
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<MessageData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Id>1665444</Id>
<Number>1665444</Number>
<Publisher xsi:type="Publisher">
<Name>Копыта</Name>
<Ogrn>1127457000388</Ogrn>
<Inn>8457345678</Inn>
</Publisher>
<MessageInfo MessageType="CompletionOfExtra">
<CompletionOfExtra>
<Text>Процедура завершена.</Text>
<StartNumber>1443</StartNumber>
</CompletionOfExtra>
</MessageInfo>
</MessageData>
Верно ли я понимаю, что мне придется в любом случае создавать новый объект документа и в него построчно собирать новую XML?
Сталкиваюсь с DBMS_XMLDOM второй раз и подозреваю, что каких то элементарных вещей не знаю, просьба подсказать.
По форуму посмотрел, но подобных задач не увидел.