我正在使用带有EXTRACTVALUE命令的MYSQL,当使用"<"小于运算符时,下面的代码返回NULL。但是"大于运算符"的">"按预期工作。为什么?
select EXTRACTVALUE('<TrackerQuery>
<Column>*</Column>
<View> view_sms_speqs</View>
<Filters>
<Filter>
<FilterColumn>DateTested</FilterColumn>
<FilterOperator><</FilterOperator>
<FilterValue>2019-04-18</FilterValue>
</Filter>
</Filters>
</TrackerQuery>', CONCAT('//TrackerQuery//Filters//Filter[', 1, ']//FilterOperator'));
问题是内容<tag><</tag>
无效,导致返回NULL
。这在EXTRACTVALUE
文档中提到:
如果
xml_frag
包含未正确嵌套或关闭的元素,则返回NULL
,并生成警告,如以下示例所示:[...]
在下面的示例中,您将看到当您使用 <
作为内容时出现错误/警告,因为它看起来像是新 XML 元素的开头。
mysql> SELECT EXTRACTVALUE('<abc><def><</def></abc>', '//abc//def');
+-------------------------------------------------------+
| EXTRACTVALUE('<abc><def><</def></abc>', '//abc//def') |
+-------------------------------------------------------+
| NULL |
+-------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------------------------------+
| Warning | 1525 | Incorrect XML value: 'parse error at line 1 pos 13: '<' unexpected (ident or '/' wanted)' |
+---------+------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
有趣的是,<
值没有发挥应有的作用。
mysql> SELECT EXTRACTVALUE('<abc><def><</def></abc>', '//abc//def');
+----------------------------------------------------------+
| EXTRACTVALUE('<abc><def><</def></abc>', '//abc//def') |
+----------------------------------------------------------+
| < |
+----------------------------------------------------------+
1 row in set (0.00 sec)
但是,当您将其放入 CDATA 块中时,您将获得正确的值。
mysql> SELECT EXTRACTVALUE('<abc><def><![CDATA[<]]></def></abc>', '//abc//def');
+-------------------------------------------------------------------+
| EXTRACTVALUE('<abc><def><![CDATA[<]]></def></abc>', '//abc//def') |
+-------------------------------------------------------------------+
| < |
+-------------------------------------------------------------------+
1 row in set (0.00 sec)