Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 XML-парсинг раз и навсегда  [new]
Rmagistr
Guest
Помогите спарсить...
так робит

Set SERVEROUTPUT ON;
declare
  l_clob  clob :=
    '<?xml version="1.0" encoding="utf-8"?>
<RS>
	<R>
		<C0>7005830005669684</C0>
		<C1>ИМЯ Илья Имявич;</C1>
		<C2></C2>
		<C3>32453245345</C3>
		<C4></C4>
		<C5>83455</C5>
		<C6>Литры</C6>
		<C7>323454338.5</C7>
		<C8>253459.25</C8>
		<C9>2934579.25</C9>
		<C10>345345345345</C10>
		<C11>54675675</C11>
		<C12>СБЕРБАНК</C12>
		<C13>657567656</C13>
	</R>
</RS>';
  l_str varchar2(32000);
begin
  for c in (select column_value as x from table(XMLSequence(XMLType(l_clob).extract('/RS/R/C3')))) 
  loop
    l_str :=  c.x.extract('/C3/text()').getStringVal();
  end loop;
  l_str := ltrim(l_str, ',');
  dbms_output.put_line (l_str);
end;
/


а так не робит

Set SERVEROUTPUT ON;
declare
  l_clob  clob :=
    '<?xml version="1.0" encoding="utf-8"?>
<RS xmlns="urn:schemas-microsoft-com:xml-analysis:rowset">
	<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:saw-sql="urn:saw-sql" targetNamespace="urn:schemas-microsoft-com:xml-analysis:rowset">
		<xsd:complexType name="R">
			<xsd:sequence>
				<xsd:element name="C0" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_CARD"."S_NUMBER"" saw-sql:displayFormula=""Карта"."Номер карты"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Карта" saw-sql:columnHeading="Номер карты" saw-sql:isDoubleColumn="false" saw-sql:columnID="c2f240a89abba2cad"/>
				<xsd:element name="C1" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_CARD"."S_DRIVERS"" saw-sql:displayFormula=""Карта"."Список водителей"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Карта" saw-sql:columnHeading="Водитель" saw-sql:isDoubleColumn="false" saw-sql:columnID="ce35dbe70b2dca03a"/>
				<xsd:element name="C2" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_CARD"."S_VEHICLES"" saw-sql:displayFormula=""Карта"."Список ТС"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Карта" saw-sql:columnHeading="ТС" saw-sql:isDoubleColumn="false" saw-sql:columnID="cdaf197d73de8391a"/>
				<xsd:element name="C3" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_CARD"."S_COMMENT"" saw-sql:displayFormula=""Карта"."Комментарий"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Карта" saw-sql:columnHeading="Комментарий клиента" saw-sql:isDoubleColumn="false" saw-sql:columnID="cf62e63b9618c8aff"/>
				<xsd:element name="C4" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_CARD"."S_GROUP_NAME"" saw-sql:displayFormula=""Карта"."Группа карт"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Карта" saw-sql:columnHeading="Группа карт" saw-sql:isDoubleColumn="false" saw-sql:columnID="c5879886a4e4efc46"/>
				<xsd:element name="C5" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:sqlFormula=""01_TRANSACTION"."F_TRANSACTION"."N_QTY"" saw-sql:displayFormula=""Показатели"."Количество"" saw-sql:aggregationRule="sum" saw-sql:aggregationType="agg" saw-sql:tableHeading="Показатели" saw-sql:columnHeading="Количество" saw-sql:isDoubleColumn="false" saw-sql:columnID="c49a6951a5cf8c980"/>
				<xsd:element name="C6" type="xsd:string" minOccurs="1" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_PRODUCT"."S_UNITS"" saw-sql:displayFormula=""Продукт"."ЕИ"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Продукт" saw-sql:columnHeading="Единица измерения" saw-sql:isDoubleColumn="false" saw-sql:columnID="c16b40fd58302fb00"/>
				<xsd:element name="C7" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:sqlFormula=""01_TRANSACTION"."F_TRANSACTION"."F_SUM_WO_DISCOUNT"" saw-sql:displayFormula=""Показатели"."Сумма покупки без скидки"" saw-sql:aggregationRule="sum" saw-sql:aggregationType="agg" saw-sql:tableHeading="Показатели" saw-sql:columnHeading="Сумма без скидки" saw-sql:isDoubleColumn="false" saw-sql:columnID="ca1e05d19850b8feb"/>
				<xsd:element name="C8" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:sqlFormula="ifnull("01_TRANSACTION"."F_TRANSACTION"."F_DISCOUNT",0)" saw-sql:displayFormula=" IFNULL("Показатели"."Скидка", 0)" saw-sql:aggregationRule="complex" saw-sql:aggregationType="agg" saw-sql:tableHeading="Показатели" saw-sql:columnHeading="Сумма скидки" saw-sql:isDoubleColumn="false" saw-sql:columnID="ca2c45a2fae1f92c1"/>
				<xsd:element name="C9" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:sqlFormula=""01_TRANSACTION"."F_TRANSACTION"."F_SUM"" saw-sql:displayFormula=""Показатели"."Сумма покупки"" saw-sql:aggregationRule="sum" saw-sql:aggregationType="agg" saw-sql:tableHeading="Показатели" saw-sql:columnHeading="Сумма к оплате" saw-sql:isDoubleColumn="false" saw-sql:columnID="c20740d6d8db13efe"/>
				<xsd:element name="C10" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:sqlFormula=""01_TRANSACTION"."F_TRANSACTION"."F_%_DISCOUNT"" saw-sql:displayFormula=""Показатели"."% скидки"" saw-sql:aggregationRule="complex" saw-sql:aggregationType="agg" saw-sql:tableHeading="Показатели" saw-sql:columnHeading="% скидки" saw-sql:isDoubleColumn="false" saw-sql:columnID="c7d9c7cc8e3dc8618"/>
				<xsd:element name="C11" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_AGREEMENT"."S_AGREEMENT_NUM"" saw-sql:displayFormula=""Договор"."Номер договора"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Договор" saw-sql:columnHeading="Номер договора" saw-sql:isDoubleColumn="false" saw-sql:columnID="cd0b531d57ab026e9"/>
				<xsd:element name="C12" type="xsd:string" minOccurs="1" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_CLIENT"."S_SHORT_NAME"" saw-sql:displayFormula=""Клиент"."Краткое наименование клиента"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Клиент" saw-sql:columnHeading="Наименование клиента" saw-sql:isDoubleColumn="false" saw-sql:columnID="c69357768769b50ac"/>
				<xsd:element name="C13" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_CLIENT"."S_INN"" saw-sql:displayFormula=""Клиент"."ИНН"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Клиент" saw-sql:columnHeading="ИНН" saw-sql:isDoubleColumn="false" saw-sql:columnID="cb0894ca4d6e6faaa"/>
			</xsd:sequence>
		</xsd:complexType>
	</xsd:schema>
	<R>
		<C0>7005830005669684</C0>
		<C1>ИМЯ Илья Имявич;</C1>
		<C2></C2>
		<C3>32453245345</C3>
		<C4></C4>
		<C5>83455</C5>
		<C6>Литры</C6>
		<C7>323454338.5</C7>
		<C8>253459.25</C8>
		<C9>2934579.25</C9>
		<C10>345345345345</C10>
		<C11>54675675</C11>
		<C12>СБЕРБАНК</C12>
		<C13>657567656</C13>
	</R>
</RS>';
  l_str varchar2(32000);
begin
  for c in (select column_value as x from table(XMLSequence(XMLType(l_clob).extract('/RS/R/C3')))) 
  loop
    l_str :=  c.x.extract('/C3/text()').getStringVal();
  end loop;
  l_str := ltrim(l_str, ',');
  dbms_output.put_line (l_str);
end;
/
2 окт 17, 15:16    [20836562]     Ответить | Цитировать Сообщить модератору
 Re: XML-парсинг раз и навсегда  [new]
еnv..
Guest
Rmagistr,

select xmltype('<?xml version="1.0" encoding="utf-8"?>
<RS xmlns="urn:schemas-microsoft-com:xml-analysis:rowset">
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:saw-sql="urn:saw-sql" targetNamespace="urn:schemas-microsoft-com:xml-analysis:rowset">
        <xsd:complexType name="R">
            <xsd:sequence>
                <xsd:element name="C0" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=""01_TRANSACTION"."D_CARD"."S_NUMBER"" saw-sql:displayFormula=""Карта"."Номер карты"" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Карта" saw-sql:columnHeading="Номер карты" saw-sql:isDoubleColumn="false" saw-sql:columnID="c2f240a89abba2cad"/>                
            </xsd:sequence>
        </xsd:complexType>
    </xsd:schema>
    <R>
        <C0>7005830005669684</C0>
        <C1>ИМЯ Илья Имявич;</C1>
        <C2/>
        <C3>32453245345</C3>
        <C4/>
        <C5>83455</C5>
        <C6>Литры</C6>
        <C7>323454338.5</C7>
        <C8>253459.25</C8>
        <C9>2934579.25</C9>
        <C10>345345345345</C10>
        <C11>54675675</C11>
        <C12>СБЕРБАНК</C12>
        <C13>657567656</C13>
    </R>
</RS>') from dual;
2 окт 17, 15:26    [20836608]     Ответить | Цитировать Сообщить модератору
 Re: XML-парсинг раз и навсегда  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5414
еnv..,

Что бы ты ни было, но ситуацию особо не прояснило.

saw-sql:sqlFormula=""01_TRANSACTION"."D_CARD"."S_NUMBER"" saw-sql:displayFormula=""Карта"."Номер карты""

Не взлетит.
XML не CSV, экранирование кавычек кавычками не поддерживает. Можете проверить валидатором .

Либо при формировании превращайте внутренние двойные кавычки в & quot; (без пробела), либо удаляйте эту недосхему из файла.
set define off
select xmltype.createXML('<?xml version="1.0" encoding="utf-8"?>
<RS xmlns="urn:schemas-microsoft-com:xml-analysis:rowset">
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:saw-sql="urn:saw-sql" targetNamespace="urn:schemas-microsoft-com:xml-analysis:rowset">
        <xsd:complexType name="R">
            <xsd:sequence>
                <xsd:element name="C0" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula="&quot;01_TRANSACTION&quot;.&quot;D_CARD&quot;.&quot;S_NUMBER&quot;" saw-sql:displayFormula="&quot;Карта&quot;.&quot;Номер карты&quot;" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Карта" saw-sql:columnHeading="Номер карты" saw-sql:isDoubleColumn="false" saw-sql:columnID="c2f240a89abba2cad"/>                
            </xsd:sequence>
        </xsd:complexType>
    </xsd:schema>
    <R>
        <C0>7005830005669684</C0>
        <C1>ИМЯ Илья Имявич;</C1>
        <C2/>
        <C3>32453245345</C3>
        <C4/>
        <C5>83455</C5>
        <C6>Литры</C6>
        <C7>323454338.5</C7>
        <C8>253459.25</C8>
        <C9>2934579.25</C9>
        <C10>345345345345</C10>
        <C11>54675675</C11>
        <C12>СБЕРБАНК</C12>
        <C13>657567656</C13>
    </R>
</RS>') from dual;
2 окт 17, 17:32    [20837028]     Ответить | Цитировать Сообщить модератору
 Re: XML-парсинг раз и навсегда  [new]
rpovarov
Member

Откуда:
Сообщений: 34
Namespace тоже надо учитывать.

Set SERVEROUTPUT ON;
declare
  l_clob  clob :=
    '<?xml version="1.0" encoding="utf-8"?>
<RS xmlns="urn:schemas-microsoft-com:xml-analysis:rowset">
	<R>
		<C0>7005830005669684</C0>
		<C1>ИМЯ Илья Имявич;</C1>
		<C2></C2>
		<C3>32453245345</C3>
		<C4></C4>
		<C5>83455</C5>
		<C6>Литры</C6>
		<C7>323454338.5</C7>
		<C8>253459.25</C8>
		<C9>2934579.25</C9>
		<C10>345345345345</C10>
		<C11>54675675</C11>
		<C12>СБЕРБАНК</C12>
		<C13>657567656</C13>
	</R>
</RS>';
  l_str varchar2(32000);
begin
  for c in (select column_value as x from table(XMLSequence(XMLType(l_clob).extract('/RS/R/C3', 'xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"')))) 
  loop
    l_str :=  c.x.extract('/C3/text()', 'xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"').getStringVal();
  end loop;
  l_str := ltrim(l_str, ',');
  dbms_output.put_line (l_str);
end;
/
3 окт 17, 11:12    [20838346]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить