有没有办法让FORCIBLY允许使用'<'和/或'>'在XML文件中?

时间:2012-04-13 13:34:27

标签: c# xml xmldocument

我编写了一个C#应用程序,它加载XML文件,解析它们并使用这些信息来运行SQL查询并将结果发送到电子邮件分发列表。

这些XML文件通常由END用户创建。

目前我让他们替换>和<用>和<在SQL中,当然是END用户,他们有时会忘记。事实上,他们总是忘记。我更喜欢将查询保存在XML文件中。那么,有没有办法强制/允许在XML文件中使用这些特殊字符?

现在我的用户必须输入:

<?xml version="1.0" encoding="utf-8" ?>
<report>
  <queries>
    <query>
       SELECT * FROM THETABLE WHERE THEVALUE &gt; 100
    </query>
  </queries>
</report>

我希望他们能够输入:

<?xml version="1.0" encoding="utf-8" ?>
<report>
  <queries>
    <query>
       SELECT * FROM THETABLE WHERE THEVALUE > 100
    </query>
  </queries>
</report>

5 个答案:

答案 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)建立的空格选项。

此表达式捕获不属于ltgt组中的标记的符号或小于和大于符号。

您可以替换匹配。

如果你想知道它是如何工作的,它会捕获命名组中的所有内容:

    (?sx)
    \s*
    (?<head><\?.*?\?>)(?:\s*)
    (?:
     (?<tag><[^\s]*?>)\s*
     |(?<others>[^<>]*\s)
     |(?<lt><)
     |(?<gt>>)
    )*
    \s*