web-dev-qa-db-ja.com

.docx XMLを細断処理す​​る方法?

Xml(実際にはdocxファイル)をSQL Server 2008データベースにインポートしようとしています。私はXMLプログラミングの初心者です。私はたくさんググりましたが、そこにあるほとんどすべての例は、単純なxmlファイルです。ここでxmlファイルは少し複雑です(以下を参照してください)。このXMLのテーブルを作成する方法と、SQLサーバーで実行するクエリを教えてください。すべてのタグに値が必要です。 w:rsidP、w:rsidRDefault、w:rsidR of w:p、w:pStyle、w:bookmarkStart、w:tタグなど.

<?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>
8
user23683

SQL ServerでXMLを操作する場合は xmlデータ型メソッド を使用し、XMLドキュメントを細断処理す​​る場合は通常nodes()およびvalue()メソッドを使用します。ここにあるXMLにはいくつかの名前空間も含まれているため、必要な名前空間を WITH XMLNAMESPACES(Transact-SQL) を使用して指定する必要があります。

XMLは非常に複雑なので、どのようにデータを抽出するかを知らなくても、必要なものに変更できるいくつかのサンプルクエリしか提供できません。

4つの_w:p_ノードがあり、これらのノードから属性をフェッチするクエリを次に示します。 _@_を使用すると、それが必要な属性の値であることを指定できます。

_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フィドル

これに加えて_w:t_ノードのテキストが必要な場合は、_cross apply_を2番目のnodes()句に実行して、_w:p_内のXMLを細断処理す​​る必要があります。ノード。

_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フィドル

質問で、すべてのタグから値を取得する必要があると述べました。これがどれほど便利かはわかりませんが、XMLのすべての属性と要素を含む名前と値のリストを作成できます。

これにより、すべての要素が得られます。

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

_'//*'_を_'//@*'_に変更すると、すべての属性が取得されます。

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

また、それらを1つのクエリに結合することもできます。

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

SQLフィドル

10
Mikael Eriksson