1

我编写了一个 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>
4

5 回答 5

4

您可以将查询包装在CDATA

<?xml version="1.0" encoding="utf-8" ?>
<report>
  <queries>
    <query><![CDATA[
       SELECT * FROM THETABLE WHERE THEVALUE > 100
    ]]></query>
  </queries>
</report>
于 2012-04-13T13:36:53.103 回答
1

使用CDATA,不解析 CDATA 中的文本,如下所示:

<query><![CDATA[SELECT * FROM THETABLE WHERE THEVALUE > 100]]></query>
于 2012-04-13T13:37:04.913 回答
1

您需要用 CDATA 包围文本,使其看起来像这样:

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

这告诉解析器之间的所有内容都应该被视为文本并且不应该被解释。

于 2012-04-13T13:37:26.083 回答
1

使用CDATA. 所以:

<query><![CDATA[SELECT * FROM THETABLE WHERE THEVALUE > 100]]></query>

解析器会忽略CDATA部分中的文本。

于 2012-04-13T13:38:02.570 回答
0

您可以使用正则表达式预处理文件,该表达式查找不属于标记的 < 和 >,并相应地替换它们。

您可以使用此正则表达式:

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

(请注意,您必须使用单行并忽略空格选项,如(?sx).

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

您可以替换匹配项。

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

    (?sx)
    \s*
    (?<head><\?.*?\?>)(?:\s*)
    (?:
     (?<tag><[^\s]*?>)\s*
     |(?<others>[^<>]*\s)
     |(?<lt><)
     |(?<gt>>)
    )*
    \s*
于 2012-04-13T14:31:39.597 回答