2009-04-22 9 views
4

ラッパーXML文書内に任意の(構文的に有効な)XML文書を埋め込む必要があります。埋め込みドキュメントは単なるテキストと見なされるため、ラッパードキュメントの解析時に解析する必要はありません。XML内の任意のXMLをラップする

私は「CDATA trick」について知っているが、内部のXMLドキュメント自体がCDATAセグメントが含まれている、と私は任意の有効なXMLドキュメントを埋め込むことができるようにする必要がある場合、私はそれを使用することはできません。これを達成するためのアドバイスやCDATAの制限を回避するためのアドバイスは高く評価されます。

+0

私の応答にあなたのコメントを読んで、私たちは、2つの異なるものの話をしているように、それはそうです。私は、XML文書内にXMLテキストをカプセル化することについて話していました。例えば、サンプルプログラムを投稿に入れることです。整形式XMLをより整形式XMLで単純にラップすることについて話しているようです。この場合、テキスト連結が最良の賭けになるかもしれません(両方のテキストがシリアライザによって生成されるべきです)。 – kdgregory

+0

このような折り返しはCDATAを伴わないことに注意してください。 – kdgregory

+0

ラップする必要のある整形式のXML自体は整形式のXML文書です。それはXML文書に埋め込まれなければなりません。あなたの答えと私の出世は、問題をきれいに解決しました。 –

答えて

3

テキストを正しくエスケープする必要があります。どの言語を使用しているのかは言いませんが、一般的にはDOMを作成し、「内部」XMLを含むTextノードを作成し、そのDOMを直列化します。シリアライザはエスケープ処理を行います。

ここで重要な点はシリアライザを使用して出力を生成することです。単純に文字列を書くのではなく、整形式のXMLではないものを作ることが保証されているからです。

+0

2回この回答が良かったのですが、単純すぎるほどXMLに包まれて返されなければならないXML文書を含むテキストストリームを受け取っていたことが、私のしていることに合わないことになりました。 DOMへのパースはタスクの一部ではありませんでした。しかし私は私のコメントを中止した。この回答はちょうど私の体重を維持し、私はついに出世をしました:入力は時間が重要だったが、出力はなかった。だからスレッドをスピンアップしてXMLをバッファし、解析し、ラップしてシリアル化します。完了! –

2

内側のCDATAの末尾の角括弧をエスケープすると、ほとんどのXMLパーサーはXMLの整形式について不平を言うことはありません。この「回避策」を使用すると、複数のCDATAセクションをネストすることができます。

のような何か:内部CDATAが終了したこと

<?xml version="1.0"?> 
<SomeData> 
<![CDATA[ 
<SomeMoreData> 
<![CDATA[ 
yeah, this trick rocks! ... 
]]&gt; 
</SomeMoreData> 
]]> 
</SomeData> 

注意 ">" &gt;と脱出しました。

1

XMLドキュメントを別のドキュメントに埋め込むのではなく、XIncludeを使用することを検討してください。 XInclude parse = "text"属性は、XMLをマークアップではなくテキストとして扱うよう強制します。

1

簡単な解決策の1つは、隣接するCDATAセクションを持つことができることです。 <![CDATA[A]]><![CDATA[B]]><![CDATA[AB]]>と同じです。したがって、<![CDATA[]]]]><![CDATA[>]]>、クローズタグを2つのCDATAセクションに分割して表示することができます。

4

これを行うには、ドキュメントの一部を子として追加してください(< ?xml宣言なし)。 SOAPはこれを行なっています - <Body>要素があり、送信したいxmlメッセージを含めることができます。

SOAPは、この方法をXSDを定義しています。

<xs:element name="Body" type="tns:Body" /> 
    <xs:complexType name="Body"> 
    <xs:sequence> 
     <xs:any namespace="##any" minOccurs="0" 
      maxOccurs="unbounded" processContents="lax" /> 
    </xs:sequence> 
    <xs:anyAttribute namespace="##any" processContents="lax"> 
    </xs:anyAttribute> 
    </xs:complexType> 
関連する問題