Bagaimana cara merobek .docx XML?

8

Saya mencoba mengimpor xml (sebenarnya file docx) ke database sql server 2008. Saya hampir pemula dalam pemrograman XML. Saya sering mencari di Google tetapi hampir semua contoh ada di file xml sederhana. Di sini file xml sedikit rumit (lihat di bawah). Bisakah Anda memberi saya ide bagaimana saya harus membuat tabel untuk XML ini dan permintaan apa yang harus saya jalankan di sql server. Saya membutuhkan nilai untuk semua tag, mis. W: rsidP, w: rsidRDefault, w: rsidR dari w: p, w: pStyle, w: bookmarkStart, w: t tags dll.

<?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="00EF42E0" w:rsidRDefault="00EF42E0" w:rsidP="00EF42E0">
<w:pPr><w:pStyle w:val="Heading1"/>
</w:pPr><w:bookmarkStart w:id="0" w:name="_Toc212523610"/>
<w:r>
<w:t>Summary</w:t>
</w:r>
<w:bookmarkEnd w:id="0"/>
</w:p>
<w:p w:rsidR="00EF42E0" w:rsidRDefault="00EF42E0" w:rsidP="00EF42E0"><w:pPr><w:pStyle w:val="mainbodytext"/><w:ind w:right="-694"/><w:rPr><w:b/><w:bCs/></w:rPr></w:pPr><w:r><w:rPr><w:b/><w:bCs/></w:rPr><w:t>What is the Group Defined Practice for Integrity Management?</w:t></w:r></w:p>
<w:p w:rsidR="00EF42E0" w:rsidRDefault="00EF42E0" w:rsidP="00EF42E0"><w:pPr><w:pStyle w:val="mainbodytext"/></w:pPr><w:r><w:t xml:space="preserve">This Practice is derived from the GP Group Standard, GRP 01 January 2006, </w:t></w:r><w:proofErr w:type="gramStart"/><w:r><w:t>Integrity</w:t></w:r><w:proofErr w:type="gramEnd"/><w:r><w:t xml:space="preserve"> Management.  In developing QMS it has been possible to embed much of the content of the IM Standard directly into the Group Essentials statements.  For elements 2, 7, 8 and 9 of the Standard it was possible to do that in their entirety and therefore content of those elements are not repeated within this Practice.</w:t></w:r></w:p></w:body></w:document>
user23683
sumber

Jawaban:

10

Ketika bekerja dengan XML dalam SQL Server Anda menggunakan Metode Tipe Data xml dan ketika merobek-robek dokumen XML Anda biasanya menggunakan nodes()dan value()metode. XML yang Anda miliki di sini juga menyertakan sejumlah ruang nama sehingga Anda harus menentukan yang Anda perlukan DENGAN XMLNAMESPACES (Transact-SQL) .

XML itu cukup kompleks sehingga tanpa mengetahui bagaimana Anda ingin data diekstraksi, saya hanya bisa memberi Anda beberapa contoh pertanyaan yang kemudian dapat Anda modifikasi menjadi apa pun yang Anda butuhkan.

Anda memiliki empat w:pnode dan di sini adalah query yang mengambil atribut dari node tersebut. Menggunakan @menentukan bahwa itu adalah nilai atribut yang Anda inginkan-

with xmlnamespaces('http://schemas.openxmlformats.org/wordprocessingml/2006/main' as w)
select P.X.value('@w:rsidR', 'char(8)') as rsidR,
       P.X.value('@w:rsidRDefault', 'char(8)') as rsidRDefault,
       P.X.value('@w:rsidP', 'char(8)') as rsidP
from @doc.nodes('/w:document/w:body/w:p') as P(X);

SQL Fiddle

Jika Anda selain ingin teks dalam w:tnode Anda perlu melakukan klausa cross applykedua nodes()yang akan merusak XML dalam w:pnode.

with xmlnamespaces('http://schemas.openxmlformats.org/wordprocessingml/2006/main' as w)
select P.X.value('@w:rsidR', 'char(8)') as rsidR,
       P.X.value('@w:rsidRDefault', 'char(8)') as rsidRDefault,
       P.X.value('@w:rsidP', 'char(8)') as rsidP,
       T.X.value('text()[1]', 'nvarchar(max)') as Text
from @doc.nodes('/w:document/w:body/w:p') as P(X)
  cross apply P.X.nodes('w:r/w:t') as T(X);

SQL Fiddle

Anda mengatakan dalam pertanyaan Anda bahwa Anda ingin mendapatkan nilai dari semua tag. Saya tidak tahu seberapa berguna ini bagi Anda, tetapi Anda bisa membuat daftar Nama-Nilai dengan semua atribut dan elemen dalam XML.

Ini akan memberi Anda semua elemen.

select T.X.value('local-name(.)', 'nvarchar(max)') Name,
       T.X.value('.', 'nvarchar(max)') Value
from @doc.nodes('//*') as T(X)

Ubah '//*'ke '//@*'dan Anda akan mendapatkan semua atribut.

select T.X.value('local-name(.)', 'nvarchar(max)') Name,
       T.X.value('.', 'nvarchar(max)') Value
from @doc.nodes('//@*') as T(X)

Dan Anda dapat menggabungkannya dalam satu permintaan juga.

select T.X.value('local-name(.)', 'nvarchar(max)') Name,
       T.X.value('.', 'nvarchar(max)') Value
from @doc.nodes('//@*, //*') as T(X)

SQL Fiddle

Mikael Eriksson
sumber