gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:12 25 4
gpt4 key购买 nike

我有一个包含 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 &lt; :price" name ="ALL Items

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

最佳答案

您的问题从这里开始:我有一个 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]]> 中-部分(参见Damian_The_Unbeliever 的评论)。 CDATA内-允许您使用禁用字符的部分...

关于c# - C# 中的 XML 解析(在 C# 中修复 XML 文档),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40475796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com