powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_XMLDOM из одной XML сделать несколько
2 сообщений из 2, страница 1 из 1
DBMS_XMLDOM из одной XML сделать несколько
    #40037531
Akel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Желаю здравствовать всем!

Имею на входе одну XML, которую с помощью DBMS_XMLDOM парсю и записываю в таблицу. Возникла необходимость для каждой записи в таблице записывать еще в соответствующую колонку типа Clob отдельный блок c XML, который был распарсен. Соответственно возник вопрос как средствами DBMS_XMLDOM можно получить этот самый блок.

Пример того, что есть в упрощенной форме:

Код: 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.
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
Код: 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
Код: 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
Код: 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 второй раз и подозреваю, что каких то элементарных вещей не знаю, просьба подсказать.
По форуму посмотрел, но подобных задач не увидел.
...
Рейтинг: 0 / 0
DBMS_XMLDOM из одной XML сделать несколько
    #40038044
Akel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А ларчик просто открывался :)

DBMS_XMLDOM.writeToClob решил поставленную задачу.
Ниже пример решения для тех кому вдруг потребуется подобное:


Код: 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.
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.
82.
83.
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  
     
     sClob               clob := '';
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_lob.createtemporary(sClob, true);
         DBMS_XMLDOM.writeToClob(nRecord, sClob); 
         dbms_output.put_line(sClob);  
     end loop;
  end if; 
end;


...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / DBMS_XMLDOM из одной XML сделать несколько
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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