ホームページ > バックエンド開発 > XML/RSS チュートリアル > FOR XMLのRAWモードのコード例の詳細説明

FOR XMLのRAWモードのコード例の詳細説明

黄舟
リリース: 2017-03-22 17:03:13
オリジナル
2273 人が閲覧しました

説明:

raw モードは、クエリ結果セットの各行を を持つ XML 要素に変換します。 XML 階層を生成するには

デフォルトでは、null 以外の値はすべて < の属性にマッピングされます。 row> 要素。

クエリ結果セット内のデータを 要素の子要素に変換する必要がある場合は、

構文:
FOR XML
RAW [ (&#39;ElementName&#39;) ] 
    [ 
       <CommonDirectives> 
       [ , { XMLDATA | XMLSCHEMA [ (&#39;TargetNameSpaceURI&#39;) ]} ] 
       [ , ELEMENTS [ XSINIL | ABSENT ] 
    ] <CommonDirectives> ::= 
   [ , BINARY BASE64 ]
   [ , TYPE ]
   [ , ROOT [ (&#39;RootName&#39;) ] ]
ログイン後にコピー

の例を参照してください。 :

テーブル Base を作成します。テーブルの構造は次のとおりです:

列名id本体id
データ型空を許可
intallows
nvarchar( 50)では、次のようにテーブルデータを挿入できます:

body

1aaaa2bbbb3cccc 4例:A. XML rawモードで使用する
ELEMENTSディレクティブを指定することで、結果セットを次の形式で表示します子要素です。

/*
结果:
    <row id="1" body="aaaa" />
    <row id="2" body="bbbb" />
    <row id="3" body="dddd" />
    <row id="4" />
*/select * from base for xml raw;
ログイン後にコピー

この例文ではid 4のbodyが表示されていないことに気付きました。

その理由は、elementsディレクティブを使用する際、以下のコマンドを指定しないとデフォルトでAbscentが使用されるためです。このときnull値の要素は作成されません

以下の例では、要素ディレクティブとxsinilディレクティブを同時に指定することでxmlにnull値を表示することができます。 null を生成する時間 列の値の要素

/*
结果:
    <row>
      <id>1</id>
      <body>aaaa</body>
    </row>
    <row>
      <id>2</id>
      <body>bbbb</body>
    </row>
    <row>
      <id>3</id>
      <body>dddd</body>
    </row>
    <row>
      <id>4</id>
    </row>
*/select * from base for xml raw,elements;
ログイン後にコピー

データごとに、 要素として表示されるため、 要素の名前を変更する方法。別の名前。

C. 要素の名前を変更します

すべての XML ファイルにはルート要素があることはよく知られています。

D 生成された XML を指定します。 for for xml ルート要素

はrootを使って指定できます。ルートディレクティブのデフォルトのルート要素は
/*
结果:
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>1</id>
      <body>aaaa</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>2</id>
      <body>bbbb</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>3</id>
      <body>dddd</body>
    </row>
    <row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>4</id>
      <body xsi:nil="true" />
    </row>
*/select * from base for xml raw,elements xsinil;
ログイン後にコピー

現時点では、生成されたxmlの結果は非常に良いようですが、データベースのbodyカラムを変更したい となるカラム名、ルート要素名、要素名を指定した場合、どのようなデメリットが発生するのでしょうか?上記の結果では、各データを区別できないようで、ID は null 値 4 です。表示されません。次の文を参照してください。

/*
结果:
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>1</id>
      <body>aaaa</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>2</id>
      <body>bbbb</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>3</id>
      <body>dddd</body>
    </baseinfo>
    <baseinfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <id>4</id>
      <body xsi:nil="true" />
    </baseinfo>
*/select * from base for xml raw(&#39;baseinfo&#39;),elements xsinil;
ログイン後にコピー
これまでのところ、見てきたようです。実際、前の文はさらに変更できます

/*
结果:
    <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <baseinfo>
        <id>1</id>
        <body>aaaa</body>
      </baseinfo>
      <baseinfo>
        <id>2</id>
        <body>bbbb</body>
      </baseinfo>
      <baseinfo>
        <id>3</id>
        <body>dddd</body>
      </baseinfo>
      <baseinfo>
        <id>4</id>
        <body xsi:nil="true" />
      </baseinfo>
    </base>
*/select * from base for xml raw(&#39;baseinfo&#39;),root(&#39;base&#39;),elements xsinil;
ログイン後にコピー

結果が別の方法で表示されるように変更しましょう。

/*
结果:
    <base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <baseinfo>
        <id>1</id>
        <data>aaaa</data>
      </baseinfo>
      <baseinfo>
        <id>2</id>
        <data>bbbb</data>
      </baseinfo>
      <baseinfo>
        <id>3</id>
        <data>dddd</data>
      </baseinfo>
      <baseinfo>
        <id>4</id>
        <data xsi:nil="true" />
      </baseinfo>
    </base>
*/select id,body data from base for xml raw(&#39;baseinfo&#39;),root(&#39;base&#39;),elements xsinil;
ログイン後にコピー

必要に応じて組み合わせて、必要な結果を生成できます。

SQLServer2005 では、XML データ型がすでにサポートされているため、XML データ型で FOR XML クエリの結果を返す TYPE 命令を記述することができます。例は次のとおりです:

/*
结果:
    1aaaa2bbbb3dddd4
*/
--因为id为int类型,为使id不出现列名,我们使id+0
--因为body为nvarchar类型,为使body不出现列名,我们使body+&#39;&#39;select id+0,body+&#39;&#39; from base for xml raw(&#39;&#39;), elements;
ログイン後にコピー
最後に、一般的な例を使用して、for XML raw モードのアプリケーションを紹介します。

Student テーブル Student を作成します。テーブル構造は次のとおりです:

列名。
データ型

null を許可します

sid

int

allows

namenvarchar(50)次のようにテーブル データを挿入します:2
Allow
id名前
1張三
李思

3

建课程表sclass,表结构如下:

王呉
列名数据类型允许空
cidint允许
namenvarchar(50)允许

插入表数据如下:

idname
1语文
2数学
3英语

建student_class表,表结构如下:

列名数据类型允许空
sidint
cidint

插入数据如下:

cidsid
11
12
13
21
32
33

至此,数据结果是:

姓名课程
张三语文
张三数学
张三英语
李四语文
王五数学
王五英语

我们需要最后的结果形式如下:

姓名课程
张三语文,数学,英语
李四语文
王五数学,英语

该如何实现呢?

/*
结果:
    张三    语文,数学,英语
    李四    语文
    王五    数学,英语
*/select [name],            
stuff(
(                    
select &#39;,&#39;+[name]                    
from sclass                    
where cid in (                                    
select cid                                    
from student_class                                    
where student.sid=student_class.sid                                
)                    
for xml raw(&#39;&#39;),elements                
),            
1,1,&#39;&#39;) sclassfrom student
ログイン後にコピー

以上がFOR XMLのRAWモードのコード例の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート