使用实体时,实体定义中的转义 XML 变为未转义

Escaped XML in entity definition becomes un-escaped when entity is used

提问人:user21397135 提问时间:3/14/2023 最后编辑:LMCuser21397135 更新时间:3/14/2023 访问量:34

问:

我有一个 XML 文件,其中包含许多存储为实体的 SQL 查询。在文档的下方,属性引用这些实体,以便将文档结构中的元素绑定到数据库中的匹配元素的 SQL 查询相关联。

其目的是:XML 控制字符('<'、'>'、'&' 等)将保持转义状态,直到加载文档。相反,文档未通过验证,因为它正在删除引用实体的任何位置的转义码。

有没有更好的方法来在实体中使用转义字符?

示例代码 (my.xml):

    <!ENTITY SQL.typeNot9                    "SELECT * FROM my_table WHERE type&lt;&gt;9">
    <item name="endFixId" browseType="database" form="example_form" SQLQuery="&SQL.typeNot9;"                        useRawValue="false" />

输出:xmllint --schema my_schema.xsd my.xml

我的.xml:123:解析器错误:“<” 属性值中不允许使用实体“SQL.typeNot9” me=“endFixId” browseType=“数据库” form=“example_form” SQLQuery=“&SQL.typeNot9;

大型遗留系统,重新排列或重新设计的选择有限。

XML 验证 实体

评论

1赞 Yitzhak Khabinsky 3/14/2023
您需要使用 CData 部分包装 SQL 语句,而不使用任何 XML 控制字符进行实体化。<![CDATA[SELECT...WHERE type<>9]]>

答:

0赞 LMC 3/14/2023 #1

可能与 XSD 定义相关,因为提供的 XML 片段按预期工作

给定此 XML

<?xml version="1.0"?>
<!DOCTYPE root [  
    <!ELEMENT item ANY >
    <!ENTITY SQL.typeNot9 "SELECT * FROM my_table WHERE type&lt;&gt;9">]>
<root>
    <item name="endFixId" browseType="database" form="example_form"
          SQLQuery="&SQL.typeNot9;"
          useRawValue="false" />
</root>

测试方式xmmlint

xmllint --noent --xpath '//@SQLQuery' tmp.xml ; echo

结果

 SQLQuery="SELECT * FROM my_table WHERE type&lt;&gt;9"

评论

0赞 user21397135 3/16/2023
尝试不使用 --noent 选项。
0赞 LMC 3/16/2023
返回这就是我添加 --noent 的原因SQLQuery="&SQL.typeNot9;"