由于转义字符

时间:2017-09-11 08:20:34

标签: java sql xml sql-server-2016

假设我有这样的SQL查询:

SELECT column_name FROM table WHERE columnid <= 5

在orm.xml中定义如下:

<named-query>
  <query>
    sql query
  </query>
</named-query>

环境说xml没有很好地形成,因为&lt;字符。所以我用google搜索解释,我发现,我必须转义字符,如下例所示

< = &lt , > = &gt

但是当我对这些字符进行excaped时,查询不会执行。这是无效的,因为逃避。您是否知道如何解决此问题或任何解决方法?

1 个答案:

答案 0 :(得分:0)

不知道这是否仍然存在,但是 - 至少 - 没有答案:

您不应该将XML视为带有花哨的额外字符的字符串。将内容放入 XML有一些规则,而 XML中的读取值也有一些规则。您可以在字符串级别轻松创建外观之类的内容,但是 - 如果您的xml无效 - 您将遇到麻烦。

最重要的例外是 - 显然! - <, > and &,如果没有转义,会打扰标记。

DECLARE @xml XML=N'<root>SELECT column_name FROM table WHERE columnid &lt;= 5</root>';
SELECT @xml.value(N'(/root/text())[1]',N'nvarchar(max)');

您会发现,转义的字符会被隐式重新转换。 但您必须使用适当的工具阅读XML!。如果您使用字符串方法(如substring)读取XML,则必须确保自己重新转义。

有一个 - 不推荐 - 解决方法:您可以使用CDATA部分,例如:

DECLARE @xml XML=N'<root><![CDATA[SELECT column_name FROM table WHERE columnid <= 5]]></root>';
SELECT @xml.value(N'(/root/text())[1]',N'nvarchar(max)');

这允许您将文本放入将采用原样的XML中。但这已经过时,并且不直接在SQL-Server中支持(嗯,有FOR XML EXPLICIT,它本身已经过时了)。 SQL-Server实际上会将上面没有CDATA的内容自动存储为转义字符串。在语义上它是一样的......