PLSQL — REGEXP_SUBSTR Удаляет XML-теги

#sql #xml #oracle #plsql #payload

#sql #xml #Oracle #plsql #полезная нагрузка

Вопрос:

В настоящее время у меня есть полезная нагрузка, сгенерированная oracle xml gateway, из которой мне нужно извлечь некоторую точную информацию. Информация о полезной нагрузке хранится в таблице БД, что означает, что я пытаюсь regexp_substr выполнить эту задачу.

Это тег, который находится в середине XML-документа

<IDCODE>S2200</IDCODE>

     "<?xml version="1.0" encoding="UTF-8" standalone='no'?>
<!DOCTYPE PROCESS_INVOICE_002 SYSTEM "asfasdf.dtd">
<!-- Oracle eXtensible Markup Language Gateway Server  -->
<PROCESS_INVOICE_002>
  <CNTROLAREA>
    <BSR>
      <VERB value="PROCESS"/>
      <NOUN value="INVOICE"/>
      <REVISION value="002"/>
    </BSR>
    <SENDER>
      <LOGICALID/>
      <COMPONENT/>
      <TASK/>
      <REFERENCEID/>
      <CONFIRMATION/>
      <LANGUAGE/>
      <CODEPAGE/>
      <AUTHID/>
    </SENDER>
    <DATETIME qualifier="CREATION">
      <YEAR/>
      <MONTH/>
      <DAY/>
      <HOUR/>
      <MINUTE/>
      <SECOND/>
      <SUBSECOND/>
      <TIMEZONE/>
    </DATETIME>
  </CNTROLAREA>
  <DATAAREA>
    <PROCESS_INVOICE>
      <INVHEADER>
        <AMOUNT qualifier="DOCUMENT" type="T" index="1">
          <VALUE>78538</VALUE>
          <NUMOFDEC>8</NUMOFDEC>
          <SIGN> </SIGN>
          <CURRENCY>USD</CURRENCY>
          <DRCR>D</DRCR>
        </AMOUNT>
        <DATETIME qualifier="DOCUMENT" index="1">
          <YEAR>2020</YEAR>
          <MONTH>11</MONTH>
          <DAY>28</DAY>
          <HOUR>00</HOUR>
          <MINUTE>00</MINUTE>
          <SECOND>00</SECOND>
          <SUBSECOND>0000</SUBSECOND>
          <TIMEZONE> 0000</TIMEZONE>
        </DATETIME>
        <DOCUMENTID>81989184</DOCUMENTID>
        <DESCRIPTN/>
        <DOCTYPE>INV</DOCTYPE>
        <PAYMETHOD/>
        <REASONCODE/>
        <USERAREA>
          <NOTEREFCODE/>
          <NOTESREF/>
          <VENDNUMQUAL>IA</VENDNUMQUAL>
          <VENDNUM>98181</VENDNUM>
          <DEPTNUMQUAL>DP</DEPTNUMQUAL>
          <DEPTNUM>85</DEPTNUM>
          <ORDNUMQUAL/>
          <ORDNUM>0</ORDNUM>
          <CUSTCODEQUAL/>
          <CUSTCODE/>
          <NETDAYS/>
          <DATETIMEQUAL/>
          <FOBCODE/>
          <UOM/>
          <TOTALQUANTITY/>
        </USERAREA>
        <PARTNER>
          <NAME index="1">COMPANY NAME</NAME>
          <ONETIME/>
          <PARTNRID/>
          <PARTNRTYPE>Supplier</PARTNRTYPE>
          <SYNCIND/>
          <ACTIVE/>
          <CURRENCY/>
          <DESCRIPTN/>
          <DUNSNUMBER/>
          <GLENTITYS/>
          <PARENTID/>
          <PARTNRIDX/>
          <PARTNRRATG/>
          <PARTNRROLE/>
          <PAYMETHOD/>
          <TAXEXEMPT/>
          <TAXID/>
          <TERMID/>
          <USERAREA>
            <IDQUAL/>
            <IDCODE/>
          </USERAREA>
          <CONTACT>
            <NAME index="1">PROFILE</NAME>
            <CONTCTTYPE/>
            <DESCRIPTN/>
            <EMAIL/>
            <FAX index="1"/>
            <TELEPHONE index="1"/>
            <USERAREA/>
          </CONTACT>
        </PARTNER>
        <PARTNER>
          <NAME index="1">CUSTOMER NAME</NAME>
          <ONETIME/>
          <PARTNRID>981698198</PARTNRID>
          <PARTNRTYPE>ShipTo</PARTNRTYPE>
          <SYNCIND/>
          <ACTIVE/>
          <CURRENCY/>
          <DESCRIPTN/>
          <DUNSNUMBER/>
          <GLENTITYS/>
          <PARENTID/>
          <PARTNRIDX/>
          <PARTNRRATG/>
          <PARTNRROLE/>
          <PAYMETHOD/>
          <TAXEXEMPT/>
          <TAXID/>
          <TERMID/>
          <USERAREA>
            <IDQUAL>ZZ</IDQUAL>
            <IDCODE>S2200</IDCODE>
          </USERAREA>
          <ADDRESS>
            <ADDRLINE index="1">123 MAIN STREET</ADDRLINE>
            <ADDRTYPE/>
            <CITY>HAM CITY</CITY>
            <COUNTRY>United States</COUNTRY>
            <COUNTY>NEW YORK</COUNTY>
            <DESCRIPTN/>
            <FAX index="1"/>
            <POSTALCODE>18080</POSTALCODE>
            <REGION/>
            <STATEPROVN>NY</STATEPROVN>
            <TAXJRSDCTN/>
            <TELEPHONE index="1"/>
            <URL/>
            <USERAREA/>
          </ADDRESS>
 

РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ, которое я использую в запросе

 TRIM(regexp_substr(ed.payload, '?. (</IDCODE>)')) Store_NUM,
TRIM(regexp_substr(ed.payload, '(^IDCODE)?. (</IDCODE>)')) Store_Number
 

Результат, который я получаю от вышеупомянутого SQL regexp_substr . Проблема в том, что я перешел на правильную вкладку, но я не могу понять, как удалить <IDCODE> и </IDCODE> для вывода

-Поле может содержать 4 или 5 символов -букв или цифр

<IDCODE>S2200</IDCODE> Store_NUM

<IDCODE>S2200</IDCODE> Store_Number

Ответ №1:

Я полагаю, что вы ищете это, если я правильно вас понимаю. Верните все в группе между тегами.

 SELECT REGEXP_SUBSTR('<IDCODE>S2200</IDCODE>', '<IDCODE>(.*)</IDCODE>', 1, 1, NULL, 1) Store_Number
from dual;


STORE_NUMBER
------------
S2200       
1 row selected.
 

Комментарии:

1. Это не вернуло информацию, которую я искал.. Я предоставил вам больше XML-файлов, чтобы посмотреть, сможете ли вы заставить его вернуть правильное число. Когда я запустил это, оно вернулось пустым.

2. Я удалил начало привязки строки из шаблона регулярных выражений. Попробуйте еще раз. Однако я не уверен, что это идеальный способ обработки данных такого типа.

3. Это не так. Однако мы находимся в процессе миграции портала edi для клиентов, и мне нужно повторно отправить все полезные данные, у которых есть S в начале номера хранилища. Не удается использовать настройки клиента, потому что у всех клиентов есть обновление. Внесенное вами изменение работало, как показано на рисунке S1902 S2472 2314 2358