2017-12-04 16 views
1

XML形式の既存の表の列の値を、XMLの属性の値として作成し、そのXML形式(角括弧、引用符など)を保持する方法を教えてください。 (何が起こっているかについて用語は文字(<が、>、「)エンティティ化されていることと思われます。)(SQL Server 2008 R2の)xml形式の属性値を持つXMLを作成する

declare @T table (
ID int identity, 
Col1 varchar(200), 
Col2 varchar(max) 
); 

insert @T 
select 'ABC', 'Value01' 
union 
select 'DEF', '<Ele01>A01</Ele01>' 
union 
select 'GHI', '<Elements><Ele02>A02</Ele02><Ele03>A03</Ele03></Elements>' 
union 
select 'JKL', '<Ele04 Att01="V01" Att02="V02" />'; 

select (
    select 
     Col1 as '@Col1', 
     Col2 as '@Col2' 
    from @T 
    for xml path(N'Item'), type 
    ) as TValues 
for xml path(N'T'), type, elements xsinil; 

結果は次のようになります。

<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <TValues> 
    <Item Col1="ABC" Col2="Value01" /> 
    <Item Col1="DEF" Col2="<Element01>A01</Element01>" /> 
    <Item Col1="GHI" Col2="<Elements><Element02>A02</Element02><Element03>A03</Element03></Elements>" /> 
    <Item Col1="JKL" Col2="<Element04 Att01="V01" Att02="V02" />" /> 
    </TValues> 
</T> 

これは、実際の結果である:私は答えを探しており、これらはやや問題に対処する私は見つけることができる唯一のリンクの一部です

<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <TValues> 
    <Item Col1="ABC" Col2="Value01" /> 
    <Item Col1="DEF" Col2="&lt;Element01&gt;A01&lt;/Element01&gt;" /> 
    <Item Col1="GHI" Col2="&lt;Elements&gt;&lt;Element02&gt;A02&lt;/Element02&gt;&lt;Element03&gt;A03&lt;/Element03&gt;&lt;/Elements&gt;" /> 
    <Item Col1="JKL" Col2="&lt;Element04 Att01=&quot;V01&quot; Att02=&quot;V02&quot; /&gt;" /> 
    </TValues> 
</T> 

http://blogs.lobsterpot.com.au/2010/04/15/handling-special-characters-with-for-xml-path/ How do I avoid character encoding when using "FOR XML PATH"? https://www.red-gate.com/simple-talk/sql/learn-sql-server/using-the-for-xml-clause-to-return-query-results-as-xml/

私は事実の後にエンティティ化文字を置き換えることができることを理解するが、私はより良い方法がなければならないと考えています。 これを実現する方法を知っている人の助けに本当に感謝します。

私の質問が誰かの基準を満たしていない場合は、お詫び申し上げます。

+1

XMLであなたの「ようになっているはずですが」だけのようにすることができ:または ' - あなたはそれを持っています:-) – Vadim

+0

Hm .. xmlの部分fter _結果は次のようになります。_は有効なxmlではありません。 – gofr1

答えて

1

XMLはXMLではありません。あなたのツールはあなたを助けてくれません。準拠していないXMLプロセッサーは、整形式でないXMLを生成するのに役立ちません。マークアップが属性値に表示されないように、またはツールが提供しているエスケープされたバージョンに対処する必要があるように、XMLデザインを修正する必要があります。

XMLデザインを修正したり、属性値のエスケープ文字を処理したりすることができないとすれば、XMLライブラリやツールはサポートされずに生き残らなければなりません。 "形式"のように見えるはずです。文字ストリームのレベルでの操作を準備し、独自のツールセットを構築します。また、XMLツールを使用できないように、データのコンシューマーを準備します。

結論:整形式でないXMLを生成しないでください。

0

あなたの言葉通り、あなたのXMLは無効です。 はXMLのような文字列を生成するのは簡単ですが、これは文字列がの有効なXMLであることを意味するものではありません。

は、私はあなたがこれを行う場合は、REPLACEを持つ文字列レベルでそれをしなければならないが、これはあなたのXMLを破壊します

後にエンティティ化文字に置き換えることができることを理解しています。有効なツールはこれを読むことができません!

最初の質問は次のとおりです。なぜこのXMLを列VARCHAR(MAX)に保存していますか? XMLは、ちょっとしたものではありません奇妙なテキストを持つばかげたテキスト...この列はXMLタイプにする必要があります。これにより、フラグメントが有効なXMLであることが保証されます。あなたが行う可能性がありますどのような

:あなたはあなたのXMLに有効なサブ要素あなたの断片を配置することができます:

select (
    select 
     Col1 as '@Col1', 
     CAST(Col2 AS XML) as 'Col2' 
    from @T 
    for xml path(N'Item'), type 
    ) as TValues 
for xml path(N'T'), type, elements xsinil; 

結果

<T xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <TValues> 
    <Item Col1="ABC"> 
     <Col2>Value01</Col2> 
    </Item> 
    <Item Col1="DEF"> 
     <Col2> 
     <Ele01>A01</Ele01> 
     </Col2> 
    </Item> 
    <Item Col1="GHI"> 
     <Col2> 
     <Elements> 
      <Ele02>A02</Ele02> 
      <Ele03>A03</Ele03> 
     </Elements> 
     </Col2> 
    </Item> 
    <Item Col1="JKL"> 
     <Col2> 
     <Ele04 Att01="V01" Att02="V02" /> 
     </Col2> 
    </Item> 
    </TValues> 
</T> 
関連する問題