我编写了一个C#应用程序,它加载XML文件,解析它们并使用这些信息来运行SQL查询并将结果发送到电子邮件分发列表。
这些XML文件通常由END用户创建。
目前我让他们替换>和<用>和<在SQL中,当然是END用户,他们有时会忘记。事实上,他们总是忘记。我更喜欢将查询保存在XML文件中。那么,有没有办法强制/允许在XML文件中使用这些特殊字符?
现在我的用户必须输入:
<?xml version="1.0" encoding="utf-8" ?>
<report>
<queries>
<query>
SELECT * FROM THETABLE WHERE THEVALUE > 100
</query>
</queries>
</report>
我希望他们能够输入:
<?xml version="1.0" encoding="utf-8" ?>
<report>
<queries>
<query>
SELECT * FROM THETABLE WHERE THEVALUE > 100
</query>
</queries>
</report>
答案 0 :(得分:5)
您可以将查询包装在CDATA
:
<?xml version="1.0" encoding="utf-8" ?>
<report>
<queries>
<query><![CDATA[
SELECT * FROM THETABLE WHERE THEVALUE > 100
]]></query>
</queries>
</report>
答案 1 :(得分:1)
使用CDATA,解析CDATA中的文本,如下所示:
<query><![CDATA[SELECT * FROM THETABLE WHERE THEVALUE > 100]]></query>
答案 2 :(得分:1)
您需要使用CDATA环绕文本,使其如下所示:
<?xml version="1.0" encoding="utf-8" ?>
<report>
<queries>
<query>
<![CDATA[SELECT * FROM THETABLE WHERE THEVALUE > 100]]>
</query>
</queries>
</report>
这告诉解析器,它们之间的所有内容都应该被视为文本,不应该被解释。
答案 3 :(得分:1)
使用CDATA
。所以:
<query><![CDATA[SELECT * FROM THETABLE WHERE THEVALUE > 100]]></query>
解析器会忽略 CDATA 部分中的文本。
答案 4 :(得分:0)
您可以使用正则表达式预处理文件,该正则表达式查找&lt;和&gt;不属于标签,并相应地替换它们。
您可以使用此正则表达式:
(?sx)
\s*
(?:<\?.*?\?>)(?:\s*)
(?:
(?:<[^\s]*?>)\s*
|(?:[^<>]*\s)
|(?<lt><)
|(?<gt>>)
)*
\s*
(请注意,您必须使用单行并忽略由(?sx)
建立的空格选项。
此表达式捕获不属于lt
和gt
组中的标记的符号或小于和大于符号。
您可以替换匹配。
如果你想知道它是如何工作的,它会捕获命名组中的所有内容:
(?sx)
\s*
(?<head><\?.*?\?>)(?:\s*)
(?:
(?<tag><[^\s]*?>)\s*
|(?<others>[^<>]*\s)
|(?<lt><)
|(?<gt>>)
)*
\s*