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标记内的特殊字符为止。(总是"或<")

如果我用"或&lt替换符号,我可以解决这个问题,但是我想知道是否有一种简单的方法可以从程序内部修复文档,而不依赖于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 &lt; :price" name ="ALL Items

将工作,但我想建立的东西做替换自动。

c#中的XML解析(在c#中修复XML文档)

你的问题从这里开始:我有一个XML文档

不,这不是XML,即使它看起来像XML!

许多人认为XML是由一些额外字符包围的文本,但这是不正确的…您的XML无效,因为在 /text() . 中使用了禁止字符

如果我理解正确的话,XML是手工编写的…您将无法以任何xml方式解析它。特别是<, > and &的使用存在很大的问题。给定的字符串也不能与Replace()一起工作…这个替换命令将无法区分< and >所需的出现和您想用相应实体替换的出现。

问题:为什么查询文本最初存储在XML标记中?

为什么不将查询存储为文本并在代码的最后一步创建XML呢?你的c#代码——如果我没看错的话——添加了带值的参数。此时,如果查询的文本只是简单的文本,则可以轻松地创建适当的XML…

方法

在我眼里只有两种方式:

难看的字符串解析

你可以写一些c#代码来找到你的(希望没有改变)标签名,并在字符串基础上分开它们。

更改XML

的创建

更好的方法是改变XML生成的方式。

  • 存储不带XML包装的查询文本,使用字符串方法动态查找参数

  • 使用Excel之类的工具填充内容,并使用某种(VBA-)代码创建具有所有所需替换的XML。

  • 作为最后(但可能是最简单的)建议,您可以将您的内容包装在<![CDATA[Your query here]]> -section中(参见Damian_The_Unbeliever的评论)。在CDATA -部分中,您可以使用禁用字符…