4

外部 dtd ファイルのエンティティを使用しようとしました。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" 
[<!ENTITY logHome SYSTEM "log4j-entity.dtd">]
>

log4j-entity.dtd

<?xml version="1.0" encoding="UTF-8"?>

<!ENTITY logHome "/root/crm_test/">

このような属性値でエンティティ値を使用しようとしました。

<param name="File" value="&logHome;log/info.log"/>

次のエラーが表示されます。

The external entity reference "&logHome;" is not permitted in an attribute value.

これどうやってするの?

ノート:

このことは動作します..

<!ENTITY logHome  "/root/crm_test/">
4

3 に答える 3

5

内部サブセット内のエンティティをパラメータ エンティティにしてから参照する必要があります。

変化する:

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" 
[<!ENTITY logHome SYSTEM "log4j-entity.dtd">]
>

に:

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" [
<!ENTITY % logHome SYSTEM "log4j-entity.dtd">
%logHome;
]>
于 2013-01-17T09:07:26.117 に答える
1

ここにはいくつか問題があります。

  1. エンティティ名logHomeを 2 つの異なるもの (Daniel Haley が指摘するように、パラメータ エンティティである必要がある宣言を含む外部エンティティ) と、置換テキストがディレクトリに名前を付ける内部エンティティに使用しています。
  2. 結果として、&logHome;属性値での への参照は、URI が「log4j-entity.dtd」であるリソースへの参照であると理解されます。

logHome目的を達成する最も簡単な方法は、内部サブセットでエンティティを宣言することです。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" [
<!ENTITY logHome "/root/crm_test/">
]>

の宣言を外部にしたい場合はlogHome、パラメーター エンティティに別の名前を使用すると、混乱が少なくなる可能性があります。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" [
<!ENTITY % logHomeDeclaration SYSTEM "log4j-entity.dtd">
%logHomeDeclaration;
]>
于 2013-01-19T01:11:50.590 に答える
1

XML 仕様では、属性値での外部エンティティの使用が明確に禁止されています。ここを参照してください: http://www.w3.org/TR/2004/REC-xml-20040204/#forbidden

以下は禁止されており、致命的なエラーを構成します: [...] 属性値内の外部エンティティへの参照。

答えは、XML では、やりたいことを実行できないということです。ただし、XSLT プロセッサを介して XML を実行し、必要に応じて変換を適用すると、同様の効果が得られる可能性があります。

于 2013-01-17T07:39:20.893 に答える