我正在使用服务器.xml文件...
案例1:
<?xml version="1.0" encoding="UTF-8"?>
<Resource name="${app.name}" />
catalina.properties
,我宣布app.name
app.name=or
案例2:
<?xml version="1.0" encoding="UTF-8"?>
<Resource name="or" />
问题是为什么案例 2 有效而案例 1 无效? 为什么在 1 个 XML 实体的情况下不解析?
即输出为:
<Resource name= "or" /> //in case 1
<Resource name= "or" /> //in case 2
关键点: 在 XML 解析过程中会发生实体扩展。
案例1
在情况 1 中,在解析过程中,Resources/@name
中没有实体 – 只有${app.name}
,调用 XML 解析器的程序可能会继续用文字文本or
替换变量:
<Resource name="or" />
下游处理可能不知道如何处理or
,并且您有"不起作用"的情况。
案例2
在情况 2 中,or
在解析之前存在于 XML 文件中。 解析后,调用 XML 解析器的程序有效地看到实体已展开:
<Resource name="or" />
并且能够"工作",因为它知道@name
"or"
时该怎么做。
请注意,如果catalina.properties
是一个 XML 文件,则在解析该文件之前会发生扩展,您将返回到"工作"案例。
溶液
选项包括以下选项之一:
- 硬连线实体
server.xml
而不是catalina.properties
。
强制在对 server.xml
进行 XML 解析之前进行属性替换。- 在
catalina.properties
文件中直接使用 Unicode 字符(不编码为 XML 实体(。