【问题标题】:XML parsing in C# (Fixing XML document within C#)C# 中的 XML 解析(在 C# 中修复 XML 文档)
【发布时间】: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 标记中遇到特殊字符。 (它总是 " 或

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

会工作,但我想构建一个自动替换的东西。

【问题讨论】:

  • 向我们展示您的 xml 示例。
  • 这个 XML 是如何生成的?如果正确执行此操作,则不应出现此类错误。如果这在你的控制之下,我会尝试在那里解决这个问题。当使用字符串方法创建 XML 时,通常会发生此类错误。并请标记您用于 SQL 查询 的 RDBMS 并在职责中显示查询(如果可用)...
  • 我建议使用 XmlDocument.selectNodes 中的 XPath 而不是爬过子节点。
  • 这不是 XML。它是一个与 XML 非常相似的字符串。我强烈建议,就像 Shnugo 所做的那样,让提供此功能的人为您提供 XML,而不是与 XML 非常相似的字符串。
  • 如果“此 XML 文件必须由不熟悉 XML 的人手动编辑”是一项要求,我建议将查询推送到元素内容中并将内容包装在 &lt;![CDATA[/]]&gt;块 - 他们想要/不小心将]]&gt; 放在他们的查询中的可能性要小得多。

标签: c# sql xml plsql


【解决方案1】:

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

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

许多人认为 XML 是被一些额外字符包围的文本,但事实并非如此...由于在 /text() 中使用了禁止字符,您的 XML 无效。

如果我理解正确,XML 是手动编写的……您将无法以任何 XML 方式解析它。特别是&lt;, &gt; and &amp; 的使用非常成问题。使用给定的字符串,您也无法使用 Replace()... 此替换命令无法区分所需的 &lt; and &gt; 出现次数和您想用相应实体替换的次数。

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

为什么不将查询存储为文本并在代码的最后一步创建 XML? 您的 C# 代码 - 如果我没看错的话 - 添加带有值的参数。如果查询的文本只是简单的文本,此时您可以轻松创建正确的 XML...

方法

在我眼里只有两种方式:

难看的字符串解析

您可以编写一些 C# 代码来查找您的(希望不会更改)标签名称,并在字符串基础上将它们分开。

更改此 XML 的创建

改变 XML 的生成方式会更好。

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

  • 使用 Excel 之类的工具按原样填写内容,并使用某种 (VBA-) 代码创建包含所有需要替换的 XML。

  • 作为最后一个(但可能是最简单的)建议,您可以将您的内容封装在 &lt;![CDATA[Your query here]]&gt;-section 中(参见 来自 Damian_The_Unbeliever 的评论)。在CDATA-部分中,您可以使用禁用字符...

【讨论】:

  • 谢谢。我想我要控制文档的编辑方式。
猜你喜欢
  • 1970-01-01
  • 2013-11-11
  • 2010-09-07
  • 1970-01-01
  • 2013-09-17
  • 2021-08-16
  • 2012-04-14
  • 1970-01-01
相关资源
最近更新 更多