4

これは有効な(整形式の)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パーサーに、上記の著作権記号を文字列「&copy;」として渡す必要があることを示す予定です。適切なUnicode文字としてではなく。

その点で、この引用は少し紛らわしいと思います。'XMLドキュメントの新しい作成者は、CDATAセクションの目的を誤解し、その目的が処理中に通常の文字データとして扱われないようにデータを「保護」することであると誤って信じています。[ただし]文字データは、CDATAセクションで表現されているか、通常のマークアップで表現されているかに関係なく、文字データです。」(ウィキペディアより)

たとえば、タグに数字しか含めることができない場合でも、CDATAセクションですべてのタグをラップした2番目の作成者から提案されたXML形式を個別に調べています。

XMLの第一人者が、CDATAの目的に関する混乱を解消するのに役立つことを願っています。

ありがとう!

4

3 に答える 3

9

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

そうです、あなたが意図しているものである限り、以下は完全に有効です。

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

ここで、inner要素の値は&copy;、XMLパーサーによって著作権シンボルのエンティティ参照として解釈されない値です。次のこともできます。

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

ここで、inner要素の値は

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

CDATAセクションなしでこれを行うには:

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

これは人間が読める形式ではありませんが、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データのクライアントがinner XMLマークアップ文字を含む値を取得できるようにします。

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

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

于 2009-03-20T04:41:58.943 に答える
5

エディは良い返事をしました。私は彼が明らかに言及しなかったいくつかの点について補足しました。

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

は正当ではありません (エンティティ "copy" は事前定義されておらず、"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>には、前の例の 1 つではなく、6 つの Unicode 文字が含まれます)。

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

も合法であり (encoding="UTF-8" で encoding="US-ASCII" を指定することは不可能であるため)、同じ結果が得られます。キーボード/エディターでこの文字を直接使用できる場合。

于 2009-03-20T16:16:44.000 に答える
1

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

もちろん、これにはCDATAが任意として扱われるという事実も伴うため、XMLに実際の©が必要な場合、これは機能しません。画像から画像パーサーにbase64でエンコードされたバイナリデータのブロブを読み込むのと同じように、CDATAのコンテンツをX/HTMLパーサーに読み込むことを計画していると想定しています。XMLパーサーは、CDATAブロックの内容から意味を導き出そうとはしません。それが言うようにそれは「foo」と言うのもよいでしょう&copy;

ウィキペディアの引用は紛らわしい言葉で書かれているようです。

于 2009-03-20T04:36:32.840 に答える