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

Откуда:
Сообщений: 419
Создал таблицу:
create table tmp_xml (xml XMLType);
Вставил в таблицу xml файл (MS Word2003).
На файл наложена схема fio.xsd:
<?xml version="1.0" encoding="windows-1251"?>
<xs:schema targetNamespace="urn:fio" xmlns="urn:fio" xmlns:mstns="urn:fio" 
 xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:complexType name="TypeInicial" mixed="true">
		<xs:annotation>
			<xs:documentation>Ф.И.О.</xs:documentation>
		</xs:annotation>
		<xs:all>
			<xs:element name="SerName" type="xs:string">
				<xs:annotation>
					<xs:documentation>Фамилия</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="FirstName" type="xs:string">
				<xs:annotation>
					<xs:documentation>Имя</xs:documentation>
				</xs:annotation>
			</xs:element>
			<xs:element name="SecondName" type="xs:string">
				<xs:annotation>
					<xs:documentation>Отчество</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:all>
	</xs:complexType>	
	<xs:element name="Root" type="TypeInicial"/>
</xs:schema>
Нужно выбрать FirstName из файла. Как это сделать?
Вот то, что я сам написал. Это не работает. Я непонимаю, что в where нужно написать?
select 
extract(t.xml,'//FirstName/text()','xmlns="urn:fio"').getStringVal() as name
from tmp_xml t;
Это сам xml-файл:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:ns1="urn:fio" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"><w:ignoreElements w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>Студент группы 98 ВМК 1 Полищук Юрий Владимирович</o:Title><o:Author>user</o:Author><o:LastAuthor>pol</o:LastAuthor><o:Revision>28</o:Revision><o:TotalTime>11</o:TotalTime><o:Created>2008-04-17T08:28:00Z</o:Created><o:LastSaved>2008-07-04T03:29:00Z</o:LastSaved><o:Pages>1</o:Pages><o:Words>5</o:Words><o:Characters>30</o:Characters><o:Company>nipigaz</o:Company><o:Lines>1</o:Lines><o:Paragraphs>1</o:Paragraphs><o:CharactersWithSpaces>34</o:CharactersWithSpaces><o:Version>11.0000</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Times New Roman" w:fareast="Times New Roman" w:h-ansi="Times New Roman" w:cs="Times New Roman"/></w:fonts><w:styles><w:versionOfBuiltInStylenames w:val="4"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="156"/><w:style w:type="paragraph" w:default="on" w:styleId="a"><w:name w:val="Normal"/><wx:uiName wx:val="Обычный"/><w:rsid w:val="007D0D12"/><w:rPr><wx:font wx:val="Times New Roman"/><w:sz w:val="28"/><w:sz-cs w:val="24"/><w:lang w:val="RU" w:fareast="RU" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="a0"><w:name w:val="Default Paragraph Font"/><wx:uiName wx:val="Основной шрифт абзаца"/><w:semiHidden/></w:style><w:style w:type="table" w:default="on" w:styleId="a1"><w:name w:val="Normal Table"/><wx:uiName wx:val="Обычная таблица"/><w:semiHidden/><w:rPr><wx:font wx:val="Times New Roman"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="a2"><w:name w:val="No List"/><wx:uiName wx:val="Нет списка"/><w:semiHidden/></w:style></w:styles><w:shapeDefaults><o:shapedefaults v:ext="edit" spidmax="15362"/><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></w:shapeDefaults><w:docPr><w:view w:val="print"/><w:zoom w:percent="100"/><w:proofState w:spelling="clean" w:grammar="clean"/><w:attachedTemplate w:val=""/><w:defaultTabStop w:val="708"/><w:punctuationKerning/><w:characterSpacingControl w:val="DontCompress"/><w:optimizeForBrowser/><w:validateAgainstSchema/><w:saveInvalidXML w:val="off"/><w:ignoreMixedContent w:val="off"/><w:alwaysShowPlaceholderText w:val="off"/><w:compat><w:breakWrappedTables/><w:snapToGridInCell/><w:wrapTextWithPunct/><w:useAsianBreakRules/><w:dontGrowAutofit/></w:compat><wsp:rsids><wsp:rsidRoot wsp:val="003873E5"/><wsp:rsid wsp:val="0007484B"/><wsp:rsid wsp:val="00084A29"/><wsp:rsid wsp:val="00087C68"/><wsp:rsid wsp:val="000F488E"/><wsp:rsid wsp:val="00154FB0"/><wsp:rsid wsp:val="001B75E1"/><wsp:rsid wsp:val="00274666"/><wsp:rsid wsp:val="002F2AAD"/><wsp:rsid wsp:val="003516C2"/><wsp:rsid wsp:val="003873E5"/><wsp:rsid wsp:val="004404F7"/><wsp:rsid wsp:val="0046006B"/><wsp:rsid wsp:val="004877EE"/><wsp:rsid wsp:val="0049157A"/><wsp:rsid wsp:val="00584758"/><wsp:rsid wsp:val="005A4E63"/><wsp:rsid wsp:val="005B0F19"/><wsp:rsid wsp:val="005B6FE9"/><wsp:rsid wsp:val="00606C82"/><wsp:rsid wsp:val="00616B2B"/><wsp:rsid wsp:val="006B2C8F"/><wsp:rsid wsp:val="007F1278"/><wsp:rsid wsp:val="0083700F"/><wsp:rsid wsp:val="008670DB"/><wsp:rsid wsp:val="00894F23"/><wsp:rsid wsp:val="00901150"/><wsp:rsid wsp:val="00977874"/><wsp:rsid wsp:val="00A26421"/><wsp:rsid wsp:val="00A54048"/><wsp:rsid wsp:val="00AA4300"/><wsp:rsid wsp:val="00AF7421"/><wsp:rsid wsp:val="00B51682"/><wsp:rsid wsp:val="00D6590C"/><wsp:rsid wsp:val="00D9312C"/><wsp:rsid wsp:val="00E602B4"/><wsp:rsid wsp:val="00E61247"/><wsp:rsid wsp:val="00E9615D"/><wsp:rsid wsp:val="00EF4251"/><wsp:rsid wsp:val="00F91F72"/><wsp:rsid wsp:val="00FA6953"/><wsp:rsid wsp:val="00FE43F1"/></wsp:rsids></w:docPr><w:body><wx:sect><ns1:Root><w:p wsp:rsidR="0049157A" wsp:rsidRPr="0049157A" wsp:rsidRDefault="00274666"><w:pPr><w:rPr><w:b/><w:lang w:val="EN-US"/></w:rPr></w:pPr><ns1:SerName><w:r wsp:rsidR="0049157A" wsp:rsidRPr="00A26421"><w:rPr><w:b/><w:i/><w:sz w:val="36"/><w:sz-cs w:val="36"/></w:rPr><w:t>Полищук</w:t></w:r></ns1:SerName><w:r wsp:rsidR="0049157A" wsp:rsidRPr="00A26421"><w:rPr><w:b/><w:i/><w:sz w:val="36"/><w:sz-cs w:val="36"/></w:rPr><w:t> </w:t></w:r><ns1:FirstName><w:r wsp:rsidR="0049157A" wsp:rsidRPr="00A26421"><w:rPr><w:b/><w:i/><w:sz w:val="36"/><w:sz-cs w:val="36"/></w:rPr><w:t>Павел</w:t></w:r></ns1:FirstName><w:r wsp:rsidR="0049157A" wsp:rsidRPr="00A26421"><w:rPr><w:b/><w:i/><w:sz w:val="36"/><w:sz-cs w:val="36"/></w:rPr><w:t> </w:t></w:r><ns1:SecondName><w:r wsp:rsidR="0049157A" wsp:rsidRPr="00A26421"><w:rPr><w:b/><w:i/><w:sz w:val="36"/><w:sz-cs w:val="36"/></w:rPr><w:t>Владимирович</w:t></w:r></ns1:SecondName></w:p></ns1:Root><w:sectPr wsp:rsidR="0049157A" wsp:rsidRPr="0049157A" wsp:rsidSect="003873E5"><w:pgSz w:w="11906" w:h="16838"/><w:pgMar w:top="1134" w:right="850" w:bottom="1134" w:left="1701" w:header="708" w:footer="708" w:gutter="0"/><w:cols w:space="708"/><w:docGrid w:line-pitch="360"/></w:sectPr></wx:sect></w:body></w:wordDocument>
4 июл 08, 08:52    [5884988]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Youra Polishuk
Member

Откуда:
Сообщений: 419
XML файл добавил в поле таблицы через SQLNavigator.
4 июл 08, 08:56    [5885000]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Maxim Demenko
Member

Откуда: Munich, Germany
Сообщений: 940
Попробуйте так
SQL> select extract(doc,'//ns1:FirstName//w:t/text()',
  2  'xmlns:ns1="urn:fio" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"')
  3  from x
  4  /

EXTRACT(DOC,'//NS1:FIRSTNAME//W:T/TEXT()','XMLNS:NS1="URN:FIO"XMLNS:W="HTTP://SCHEMAS.MICROSOFT.COM/OFFICE/WORD/2003/WORDML"'
-----------------------------------------------------------------------------------------------------------------------------
Павел

Best regards

Maxim
4 июл 08, 23:03    [5890222]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Youra Polishuk
Member

Откуда:
Сообщений: 419
Спасибо получилось!
7 июл 08, 14:01    [5896328]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Youra Polishuk
Member

Откуда:
Сообщений: 419
Помогите пожалуйста еще с одним запросом.
Задачка аналогичная, но XML документ Word 2007.
Схема:
<?xml version="1.0" encoding="windows-1251"?>
<xs:schema targetNamespace="urn:numberp" xmlns="urn:numberp" xmlns:mstns="urn:numberp" 
 xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:complexType name="Tnumberp" mixed="true">
      <xs:all>
			<xs:element name="numberp" type="xs:string">
				<xs:annotation>
					<xs:documentation>═ε∞σ≡ ∩≡εσΩ≥α</xs:documentation>
				</xs:annotation>
			</xs:element>
	  </xs:all>		
	</xs:complexType>	
	<xs:element name="Root" type="Tnumberp"/>
</xs:schema>
Это форагмент документа:
<w:customXml w:uri="urn:numberp" w:element="Root">
 <w:customXml w:uri="urn:numberp" w:element="numberp">
  <w:p w:rsidR="00A321A7" w:rsidRPr="00A321A7" w:rsidRDefault="00716FCC" w:rsidP="008C64EA">
   <w:pPr><w:jc w:val="center"/>
   </w:pPr>
   <w:r w:rsidRPr="00716FCC">
    <w:rPr><w:sz w:val="40"/>
    <w:szCs w:val="40"/>
    </w:rPr>
    <w:t>11111-АСУ.ТП</w:t>
   </w:r>
  </w:p>
 </w:customXml>
</w:customXml>
Схема (urn:numberp) состоит из одного элемента (numberp).
Такой вот запрос работает:
select 
extract(t.xml,'//customXml//text()','xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main"').getStringVal() as Par
from tmp_xml t;
Если схем несколько или схема сложная, то нужно в XPath строке значения элементов (название схемы и элемент). Я думаю, что так:
select 
extract(t.xml,'//customXml[uri="urn:numberp" and element="numberp"]//text()','xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main"').getStringVal() as Par
from tmp_xml t;
Этот вариант не работает. Ничего не возвращает.
7 июл 08, 14:12    [5896439]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Volder
Member

Откуда: Москва
Сообщений: 474
- для обозначения аттрибутов в XPath нужно указывать '@' перед именем.
- избавляйтесь от методов вроде '...//text()', если нужен текст конкретного узла - до него и указывайте путь,
иначе:
а) XML процессор лишние манипуляции совершает;
б) результат может быть не тот, который вы получаете - если XML поменяется.

PS конечно, это если Вам не нужно получать все текстовые значения ВСЕХ дочерних customXml элементов.
7 июл 08, 15:17    [5897027]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Youra Polishuk
Member

Откуда:
Сообщений: 419
При вот такой выборке
select 
extract(t.xml,'//customXml','xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main"')
from tmp_xml t;
выдает:
<w:customXml xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:uri="urn:numberp" w:element="Root">
  <w:customXml w:uri="urn:numberp" w:element="numberp">
    <w:p w:rsidR="00A321A7" w:rsidRPr="00A321A7" w:rsidRDefault="00716FCC" w:rsidP="008C64EA">
      <w:pPr>
        <w:jc w:val="center"/>
      </w:pPr>
      <w:r w:rsidRPr="00716FCC">
        <w:rPr>
          <w:sz w:val="40"/>
          <w:szCs w:val="40"/>
        </w:rPr>
        <w:t>11111-АСУ.ТП</w:t>
      </w:r>
    </w:p>
  </w:customXml>
</w:customXml>
<w:customXml xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:uri="urn:numberp" w:element="numberp">
  <w:p w:rsidR="00A321A7" w:rsidRPr="00A321A7" w:rsidRDefault="00716FCC" w:rsidP="008C64EA">
    <w:pPr>
      <w:jc w:val="center"/>
    </w:pPr>
    <w:r w:rsidRPr="00716FCC">
      <w:rPr>
        <w:sz w:val="40"/>
        <w:szCs w:val="40"/>
      </w:rPr>
      <w:t>11111-АСУ.ТП</w:t>
    </w:r>
  </w:p>
</w:customXml>
Я не понимаю почему дважды.
В файле вот что:
<w:customXml w:uri="urn:numberp" w:element="Root">
            <w:customXml w:uri="urn:numberp" w:element="numberp">
              <w:p w:rsidR="00A321A7" w:rsidRPr="00A321A7" w:rsidRDefault="00716FCC" w:rsidP="008C64EA">
                <w:pPr>
                  <w:jc w:val="center"/>
                </w:pPr>
                <w:r w:rsidRPr="00716FCC">
                  <w:rPr>
                    <w:sz w:val="40"/>
                    <w:szCs w:val="40"/>
                  </w:rPr>
                  <w:t>11111-АСУ.ТП</w:t>
                </w:r>
              </w:p>
            </w:customXml>
          </w:customXml>
Запрос с указанием значений элементов ничего не возвращает:
select 
extract(t.xml,'//customXml[@uri="urn:numberp" and @element="numberp"]//text()','xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main"').getStringVal() as TextEl
from tmp_xml t;
8 июл 08, 06:59    [5899884]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Volder
Member

Откуда: Москва
Сообщений: 474
Youra Polishuk

<w:customXml xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:uri="urn:numberp" w:element="Root">
  <w:customXml w:uri="urn:numberp" w:element="numberp">
 ...
  </w:customXml>
</w:customXml>
...
Я не понимаю почему дважды.
ответ выше - у Вас два customXml - оба и возвращаются.
все дело в '//customXml'
Youra Polishuk

select 
extract(t.xml,'//customXml[@uri="urn:numberp" and @element="numberp"]//text()','xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main"').getStringVal() as TextEl
from tmp_xml t;

'//w:customXml[@w:element="numberp"]','xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"'
8 июл 08, 08:21    [5899961]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Youra Polishuk
Member

Откуда:
Сообщений: 419
Я это понял, что их два.
<w:customXml xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:uri="urn:numberp" w:element="Root">
  <w:customXml w:uri="urn:numberp" w:element="numberp">
Но только у одного из них значение атрибутов w:uri="urn:numberp" w:element="numberp".
Мне нужно выбрать именно его! Разве это невозможно?
8 июл 08, 08:26    [5899967]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Volder
Member

Откуда: Москва
Сообщений: 474
Youra Polishuk
Мне нужно выбрать именно его! Разве это невозможно?
внимательно читайте
ответ дал Вам в предыдущем посте
8 июл 08, 08:31    [5899976]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Youra Polishuk
Member

Откуда:
Сообщений: 419
Не понял.
// - означают, что возвращаются все customXml.
Так и получается их 2 штуки. Запрос возвращает два нода. Если к документу подключить ещё одну схему количество нод увеличится. Мне нужно выбирать соответствующую. Все ноды отличаются по значениям атрибутов uri, element.
Когда я добавляю в XPath поиск критерии для атрибутов uri, element, то как я понимаю запрос должен вернуть лишь один customXml удовлетворяющий условиям XPath'а.
8 июл 08, 09:43    [5900212]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Volder
Member

Откуда: Москва
Сообщений: 474
Youra Polishuk
Когда я добавляю в XPath поиск критерии для атрибутов uri, element, то как я понимаю запрос должен вернуть лишь один customXml удовлетворяющий условиям XPath'а.
все правильно понимаете - только добавляйте правильно:
Volder
'//w:customXml[@w:element="numberp"]','xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"'
8 июл 08, 10:07    [5900375]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг Word XML  [new]
Youra Polishuk
Member

Откуда:
Сообщений: 419
Спасибо. Заработало.
8 июл 08, 11:18    [5901048]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить