c#中的XML解析(在c#中修复XML文档)
本文关键字:XML 文档 中的 解析 | 更新日期: 2023-09-27 18:16:47
我有一个充满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中崩溃。当它遇到这个问题时
下面是一个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!
许多人认为XML是由一些额外字符包围的文本,但这是不正确的…您的XML无效,因为在/text()
.
中使用了禁止字符。如果我理解正确的话,XML是手工编写的…您将无法以任何xml方式解析它。特别是<, > and &
的使用存在很大的问题。给定的字符串也不能与Replace()
一起工作…这个替换命令将无法区分< and >
所需的出现和您想用相应实体替换的出现。
为什么不将查询存储为文本并在代码的最后一步创建XML呢?你的c#代码——如果我没看错的话——添加了带值的参数。此时,如果查询的文本只是简单的文本,则可以轻松地创建适当的XML…
方法在我眼里只有两种方式:
难看的字符串解析
你可以写一些c#代码来找到你的(希望没有改变)标签名,并在字符串基础上分开它们。
更改XML
的创建更好的方法是改变XML生成的方式。
存储不带XML包装的查询文本,使用字符串方法动态查找参数
使用Excel之类的工具填充内容,并使用某种(VBA-)代码创建具有所有所需替换的XML。
作为最后(但可能是最简单的)建议,您可以将您的内容包装在
<![CDATA[Your query here]]>
-section中(参见Damian_The_Unbeliever的评论)。在CDATA
-部分中,您可以使用禁用字符…