簡體   English   中英

如何在log4j.xml中使用DTD ENTITY外部引用

[英]How to use DTD ENTITY external reference in log4j.xml

我試圖使用外部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/">

您需要將內部子集中的實體作為參數實體,然后引用它。

更改:

<!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;
]>

XML規范明確禁止在屬性值中使用外部實體。 見這里: http//www.w3.org/TR/2004/REC-xml-20040204/#forbidden

以下是禁止的,並構成致命錯誤:[...]在屬性值中引用外部實體。

所以答案是:XML不會讓你做你想做的事情。 但是,如果通過XSLT處理器運行XML並根據需要應用轉換,則可能會產生類似的效果。

這里有一些錯誤。

  1. 您正在使用實體名稱logHome用於兩個不同的事物(包含聲明的外部實體,應該像Daniel Haley指出的那樣是一個參數實體)和一個內部實體,其替換文本命名一個目錄。
  2. 因此,您對&logHome;的引用&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;
]>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM