【问题标题】:How to use DTD ENTITY external reference in log4j.xml如何在 log4j.xml 中使用 DTD ENTITY 外部引用
【发布时间】:2012-12-31 16:49:23
【问题描述】:

我尝试使用外部 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/">

【问题讨论】:

    标签: java xml log4j dtd


    【解决方案1】:

    这里有几个问题。

    1. 您将实体名称 logHome 用于两个不同的事物(一个包含声明的外部实体,正如 Daniel Haley 指出的那样,它应该是一个参数实体)和一个内部实体,其替换文本命名一个目录。
    2. 因此,您在属性值中对&amp;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;
    ]>
    

    【讨论】:

      【解决方案2】:

      XML 规范明确禁止在属性值中使用外部实体。见这里:http://www.w3.org/TR/2004/REC-xml-20040204/#forbidden

      以下是被禁止的,并构成致命错误:[...] 在属性值中对外部实体的引用。

      所以答案是:XML 不会让你做你想做的事。但是,如果您通过 XSLT 处理器运行 XML 并根据需要应用转换,则可能会获得类似的效果。

      【讨论】:

      • 我认为 OP 意外引用了外部实体。他/她真正想要引用的实体不是外部实体。这在 XML 中是可能的。
      • 啊,是的,确实有道理。
      【解决方案3】:

      您需要将内部子集中的实体作为参数实体,然后引用它。

      变化:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-05
        • 2011-07-24
        • 2015-11-11
        • 2011-09-09
        • 2018-06-17
        • 2016-04-01
        相关资源
        最近更新 更多