2

我正在使用 server.xml 文件...

情况1:

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

<Resource name="${app.name}" />

catalina.properties我已经宣布app.name

app.name=&#x6F;&#x72;

案例二:

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

<Resource name="&#x6F;&#x72;" />

问题是为什么案例 2 有效而案例 1 无效?为什么万一 1 XML 实体不解析?

即输出是:

<Resource name= "&#x6F;&#x72;"  />    //in case 1
<Resource name= "or"  />              //in case 2
4

1 回答 1

1

关键点: 实体扩展发生在 XML 解析过程中。

情况1

在案例 1 中,在解析期间,没有实体Resources/@name– 只是${app.name},调用 XML 解析器的程序可能会继续用文字文本 , 替换&#x6F;&#x72;变量:

<Resource name="&#x6F;&#x72;" />

下游处理可能不知道如何处理&#x6F;&#x72;,并且您有“不工作”的情况。

案例2

情况 2,&#x6F;&#x72;解析前存在于 XML 文件中。解析后,调用 XML 解析器的程序有效地看到实体展开:

<Resource name="or" />

并且能够“工作”,因为它知道什么时候@name该做什么"or"

请注意,它曾经catalina.properties是一个 XML 文件,然后会发生扩展,然后解析文件,然后您将回到您的“工作”案例。

解决方案

选项包括以下之一:

  1. 硬连线实体server.xml而不是catalina.properties.
  2. 强制在 .xml 的 XML 解析之前进行属性替换server.xml
  3. catalina.properties在文件中直接使用 Unicode 字符(不编码为 XML 实体) 。
于 2019-12-03T16:40:09.183 回答