Обработка документов MS Office 2007 в базе данных

Youra Polishuk
Дата: 04.11.2008 13:08:57
Необходимо решить следующую задачу.
Пусть в базе есть простейшая таблица в которой хранятся файлы
MS Word 2007 (docx). В этих файлах с использвонием схемы документа (xsd)
тегами маркирована нужная информация.
Как с помошью Select выбрать маркированную информацию из документов docx?
Формат docx - это архив. В котором есть в папке work файл document.xml.
Для решения моей задачи нужно получить доступ к этому файлу и используя xpath выташить
содержимое. Я тут нашел статью по DB2. В этой статье показан пример реализации доступа к
содержимому документа: http://www.ibm.com/developerworks/ru/library/dm-0705gruber/index.html

Для MS Office 2003 я решал подобную задачу (Oracle 9i). Для этого я предварительно
сохранял документ как xml с оформлением, а затем вот таким запросом получал его содержимое:
select 
extract(t.xml,'//Square//text()','xmlns="urn:GIS"').getStringVal() as Square,
extract(t.xml,'//UKPG//text()','xmlns="urn:GIS"').getStringVal() as UKPG,
extract(t.xml,'//SKV//text()','xmlns="urn:GIS"').getStringVal() as SKV,
extract(t.xml,'//Pribor//TypeP//text()','xmlns="urn:GIS"').getStringVal() as Pribor,
extract(t.xml,'//FIOINt//text()','xmlns="urn:GIS"').getStringVal() as FIOINt
from GIS_xml t;
Вот простеший пример xsd схемы. С помощью него в документе маркируется
номер проекта:
<?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>
Я приложил к письму пример документа с размеченным в нем номером проекта.
Как его выташить?

Заранее спасибо.
Youra Polishuk
Дата: 04.11.2008 13:44:38
Это содержимое документа /word/document.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
- <w:body>
- <w:p w:rsidR="00FC3B2D" w:rsidRDefault="00FC3B2D">
- <w:r>
  <w:t>Вот номер проекта:</w:t> 
  </w:r>
  </w:p>
- <w:customXml w:uri="urn:numberp" w:element="Root">
- <w:customXml w:uri="urn:numberp" w:element="numberp">
- <w:p w:rsidR="00A36263" w:rsidRPr="00FC3B2D" w:rsidRDefault="00FC3B2D">
- <w:r>
- <w:rPr>
  <w:lang w:val="en-US" /> 
  </w:rPr>
  <w:t>1915-23-</w:t> 
  </w:r>
- <w:r>
  <w:t>АСУ.П2</w:t> 
  </w:r>
  </w:p>
  </w:customXml>
  </w:customXml>
- <w:sectPr w:rsidR="00A36263" w:rsidRPr="00FC3B2D" w:rsidSect="00A36263">
  <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:linePitch="360" /> 
  </w:sectPr>
  </w:body>
  </w:document>
Нужно вытащить текст 1915-23-АСУ.П2.
Elic
Дата: 04.11.2008 14:05:56
Youra Polishuk
Нужно вытащить текст 1915-23-АСУ.П2.
select xmltype(
'<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
  <w:document xmlns:ve="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml">
  <w:body>
  <w:p w:rsidR="00FC3B2D" w:rsidRDefault="00FC3B2D">
  <w:r>
  <w:t>Вот номер проекта:</w:t> 
  </w:r>
  </w:p>
  <w:customXml w:uri="urn:numberp" w:element="Root">
  <w:customXml w:uri="urn:numberp" w:element="numberp">
  <w:p w:rsidR="00A36263" w:rsidRPr="00FC3B2D" w:rsidRDefault="00FC3B2D">
  <w:r>
  <w:rPr>
  <w:lang w:val="en-US" /> 
  </w:rPr>
  <w:t>1915-23-</w:t> 
  </w:r>
  <w:r>
  <w:t>АСУ.П2</w:t> 
  </w:r>
  </w:p>
  </w:customXml>
  </w:customXml>
  <w:sectPr w:rsidR="00A36263" w:rsidRPr="00FC3B2D" w:rsidSect="00A36263">
  <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:linePitch="360" /> 
  </w:sectPr>
  </w:body>
  </w:document>'
).extract('//customXml//t/text()', 'xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main"')
 .getStringVal() as res
from dual;

RES
----------------------
1915-23-АСУ.П2
Youra Polishuk
Дата: 04.11.2008 14:15:32
Спасибо.
Но я незнаю как вытащить document.xml? Он же хранится в blob поле в zip архиве.
Мне нужно как-то распаковать архив вытащить файл /word/document.xml, а затем по нему
xpath'ом выборку сделать.
Elic
Дата: 04.11.2008 14:36:15
Youra Polishuk
Мне нужно как-то распаковать архив вытащить файл /word/document.xml
STFF
Youra Polishuk
Дата: 04.11.2008 17:24:28
В 10 версии Oracle есть команда PL/SQL UTL_COMPRESS.
utl_compress.lz_uncompress(src IN BLOB) RETURN BLOB;
Я так понял можно как-то один файл достать? Можно еще с помощью java.
Разъясните пожалуйста. Может ссылка на пример есть?
Заранее благодарен.
Youra Polishuk
Дата: 05.11.2008 08:05:23
Вот нашел хороший пример (Oracle 10i). Но в этом примере архив состоит из одного единственного
файла, а в моем случае файлов несколько.
Подскажите как сделать?
http://www.whitehorses.nl/?link=1812