2009-03-20 7 views
3

有効な(整形式の)XML文書ですか?問題のXHTMLエンティティエンコーディングは、CDATAタグ内に含まれている限り、XML文書で有効ですか?

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&copy;</inner> 
</outer> 

HTML/XHTMLかどうかである「©」実体のエンコーディングは、それを定義するための何のDTDまたはスキーマがないXML文書に有効です。上記を表現する別の方法はこれを言うために、次のようになりますように思わ

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&#169;</inner> 
</outer> 

はUTF-8エンコーディングで有効なXMLであることを。

しかし、これは有効です。

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 

上記の著者はそれを文字列として上記の著作権記号を通過しなければならないXMLパーサーに指示するつもりで「&コピー;」適切なUnicode文字としてではなく、 XML文書の新しい著者は、処理中にデータが通常の文字データとして扱われるのを「保護する」と誤って信じていることがよくあります。 。 [しかし]文字データにかかわらず、それがCDATAセクションまたは通常のマークアップを介して発現されているかどうかの、文字データである。」(Wikipediaから)

私は別々にごとに包まれた二著者からの提案XML形式で探していますタグは、例えば、数字のみを含めることができさえCDATAセクションでタグ。

は、XMLの第一人者は、CDATAの目的に混乱を解消することができます願っています。

ありがとう!

答えて

7

CDATAセクションは、通常、XML文書内で特別な方法で解釈されるリテラルテキストを許可するためのものです。つまり、エンティティ参照のように見えるもの、またはXMLタグのように見えるものです。 CDATAセクション内のものは、CDATAセクションなしで有効なXMLの内部にあることができます。エンティティ参照を使用して様々な特殊文字をエンコードする必要があります。そのため、XMLマークアップとして扱われるのではなく、タグの値である文字データとして扱われます。

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 

ここで、inner要素の値は、XMLパーサによって解釈されることはありません値&copy;がある:

はそうです、以下は、それはあなたが意図するものである限り、完全に有効です著作権シンボルの実体参照として使用します。また、次の操作を行うことができます

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&lt;normally&gt; this looks &lt;like/&gt; &amp;amp; xml &lt;/normally&gt;</inner> 
</outer> 

はるかに小さい人間:inner要素の値が

<normally> this looks <like/> &amp; xml </normally> 

は、CDATAセクションせずにこれを行うにはある

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[<normally> this looks <like/> &amp; xml </normally>]]></inner> 
</outer> 

XMLパーサーが関係する限り、それは同等ではありません。あなたは(inner要素が文字列ではなくXMLを含むものとしてスキーマまたはDTDに定義されていることを仮定して)これをしなかった場合は、あなたのXMLパーサーが文句を言うだろう:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><normally> this looks <like/> &amp; xml </normally></inner> 
</outer> 

をので、あなたが守るためにエスケープCDATAまたはエンティティを使用しますXMLパーサの特殊文字を使用すると、XMLデータのクライアントはXMLマークアップ文字を含むinnerという値を取得できます。

注:明確にするために、上記の例では整形 XMLですが、スキーマまたはDTDは、要素innerはXSDが含まれていることを言っている場合:、それは無効 XMLドキュメントの文字列または同等です。

XMLの一部として定義されていないHTMLエンティティまたはXHTMLエンティティは、定義されていないと有効なXMLではありません。 XMLパーサーがエラーを返します。

+0

最後の例は整形式ではありませんか?あなたは、適用されたDTDまたはXSDがネストされたタグを許可しなければならないと言っているだけです... 私が理解したことを確かめてください。 :-) –

+0

はい、最後の例は*整形式のXMLですが、スキーマやDTDで "inner"タグの内容が文字データで、他の要素ではないとすると、無効なXMLになる可能性があります。 – Eddie

+0

あなたのコメントに応じて私のasnwerが更新されました。 – Eddie

1

内容のCDATAブロックは無視されますXMLパーサーであるため、検証や解析容易性に関しては、好きなものをCDATAに入れることができます。

もちろん、CDATAはと任意のと扱われるため、XMLに実際に©が必要な場合は、これは機能しません。イメージからイメージパーサーにbase64でエンコードされたバイナリデータをロードするのと同じように、CDATAの内容をX/HTMLパーサーにロードすることを前提としています。 XMLパーサは、CDATAブロックの内容から意味を引き出すことを試みません。それはまた、&copy;と言うように "foo"と言うかもしれません。

ウィキペディアの見積もりは混乱しているようです。

+1

いいえ、それは無視されません。文字通り純粋なテキストとしてアプリケーションに渡されます。 – bortzmeyer

5

Eddieは良い返事をした、私は彼が明らかに言及しなかったいくつかの点を完了しました。

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&copy;></inner> 
</outer> 

(エンティティ "コピー" が事前に定義されないが、唯一の "LT"、 "GT" と "QUOT" XMLである)合法ではありません。

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>&#169;</inner> 
</outer> 

完全に合法であると、おそらくあなたは(著作権 シンボル)欲しいものを提供します。

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner><![CDATA[&copy;]]></inner> 
</outer> 

も完全に合法であるが、かなり異なる結果が得られます( 要素<inner>が6つのUnicode文字の代わりに、 前の例の1が含まれます)。

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE outer[ 
<!ENTITY copy "&#169;"> 
]> 
<outer> 
    <inner>&copy;></inner> 
</outer> 

も有効であり、2番目の例と同じ結果が得られます。 あなたのキーボード/エディタで を生成するのは簡単ですが使用する文字を入力しないようにすることができます。

<?xml version="1.0" encoding="UTF-8" ?> 
<outer> 
    <inner>©</inner> 
</outer> 

、法的すぎる(なぜならエンコード= "UTF-8"、エンコーディング= "US-ASCII" と、それ は不可能だったでしょう)、そして同じ結果を与えます。 キーボード/エディタを使用すると、この文字を直接使用できるようになります。

関連する問題