3

XML パーサーをサポートするために、html ファイル内のすべて&nbsp;をに置き換えたいと考えています。&#160;しかし、私はそれらを直接置き換えたくありません。以下の<!DOCTYPE >ようにエンティティを追加したいと思います:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"[<!ENTITY nbsp "&#160;">]> <html><head></head><body><div>Hello&nbsp;World!</div></body></html>

しかし、ファイルを表示する]>と、ドキュメントの上部に余分なものがあります:

対処方法を知っている人はいますか?

ありがとう!

4

2 に答える 2

1

あなたが持っているのは、内部サブセットにエンティティ宣言を含めるための有効な方法です。ただし、 W3C Markup Validatorで確認できるため、ドキュメントは他の方法では有効ではありません。要素の必須xmlns属性が欠落しているため、必須属性も欠落しています。htmltitle

text / htmlとして提供される場合、ドキュメントはブラウザがHTMLドキュメントを処理するために使用する方法で処理されます。これは、とりわけ、内部サブセットが認識されないことを意味します。実際、ドキュメント型定義はまったく読み取られません。代わりに、doctype宣言はマジックストリングとして扱われるため、一部の文字列は「クァークズモード」をトリガーし、一部はトリガーしません。doctype宣言は単純な方法で解析され、最初の「>」で終了するため、その後に続くものはすべて文字データとして取得されます。

士気は、エンティティ宣言が「HTML」で内部的または外部的に機能しないことです。「HTML」がブラウザに何かを送信し、(HTTPヘッダーで)それをtext / htmlであると伝えることを意味する場合、これはサーバーが通常伝えることです。 .htmlファイルを送信するとき。

application / xhtml + xmlとして機能し、XHTML構文に準拠するように修正されたアプローチは、準拠するブラウザーで機能します(オンラインデモ:http ://www.cs.tut.fi/~jkorpela/test/nbsp.xhtml ):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
 [<!ENTITY nbsp "&#160;">]>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Entity demo</title></head>
<body>
  <div>Hello&nbsp;World!</div>
</body>
</html>

ただし、IE8以前はapplication/ xhtml + xmlとして提供されている場合はHTMLを処理しません(ブラウザーは[名前を付けて保存]ダイアログを起動するだけです)。

結論は、実行していることと、「XMLパーサーをサポートする」必要がある理由(およびその意味)によって異なります。それは実際には構文解析ではなく、エンティティ宣言についてです。XHTMLユーザーエージェントは、HTMLのように事前定義されたエンティティを理解する必要はありません(XMLで定義されたものを除く)が、この可能性はどういうわけか実現されていますか?&nbsp;また、一般的には、文字参照よりも実際のノーブレークスペース文字に変換する方が適切です。

于 2012-12-03T07:44:33.540 に答える