【发布时间】:2017-03-21 10:09:27
【问题描述】:
我有一个包含 SQL 查询的 XML 文档,我想将它们加载到我的程序中并执行它们。
public List<SQLQuery> Load_ReportQueries()
{
XmlDocument xmlDoc = new XmlDocument();
using (FileStream fs = new FileStream("Resources\\XReport.xml", FileMode.Open, FileAccess.Read))
{
Dictionary<String, object> parameters = new Dictionary<string, object>();
List<SQLQuery> queries = new List<SQLQuery>();
xmlDoc.Load(fs);
foreach (XmlNode node in xmlDoc.ChildNodes)
{
foreach (XmlNode subNode in node.ChildNodes)
{
if (subNode.Name == "query")
{
string name = HttpUtility.HtmlDecode(subNode.Attributes["name"].InnerXml);
string query = HttpUtility.HtmlDecode(subNode.Attributes["val"].InnerXml);
foreach (XmlNode subNode2 in subNode.ChildNodes)
{
if (subNode2.Name == "varname")
{
try
{
if (subNode2.Attributes["val"].InnerXml == "null")
{
parameters.Add(subNode2.Attributes["name"].InnerXml, null);
}
else
{
parameters.Add(subNode2.Attributes["name"].InnerXml, subNode2.Attributes["val"].InnerXml);
}
}
catch (NullReferenceException e)
{
frmMainForm.showMsg("Error in XML document\n" + e.ToString());
}
}
}
queries.Add(new SQLQuery(name, query, parameters));
parameters.Clear();
}
}
}
return queries;
}
这一直有效,直到程序在 Query 标记中遇到特殊字符。 (它总是 " 或
如果我用 " 或 < 替换符号,我可以解决问题,但我想知道是否有一种简单的方法可以从程序中修复文档,而不依赖于 XML 是否正确。
目前,每当遇到此问题时,它都会在 xmlDoc.Load 行崩溃
这是一个 XML 条目的示例:
<reports>
<query val ="SELECT * from items where price < :price" name ="ALL Items LESS THAN">
<varname name="price" val="null"/>
</query>
</reports>
将查询更改为:
<query val ="SELECT * from items where price < :price" name ="ALL Items
会工作,但我想构建一个自动替换的东西。
【问题讨论】:
-
向我们展示您的 xml 示例。
-
这个 XML 是如何生成的?如果正确执行此操作,则不应出现此类错误。如果这在你的控制之下,我会尝试在那里解决这个问题。当使用字符串方法创建 XML 时,通常会发生此类错误。并请标记您用于 SQL 查询 的 RDBMS 并在职责中显示查询(如果可用)...
-
我建议使用 XmlDocument.selectNodes 中的 XPath 而不是爬过子节点。
-
这不是 XML。它是一个与 XML 非常相似的字符串。我强烈建议,就像 Shnugo 所做的那样,让提供此功能的人为您提供 XML,而不是与 XML 非常相似的字符串。
-
如果“此 XML 文件必须由不熟悉 XML 的人手动编辑”是一项要求,我建议将查询推送到元素内容中并将内容包装在
<![CDATA[/]]>块 - 他们想要/不小心将]]>放在他们的查询中的可能性要小得多。