【问题标题】:Can DataSet be loaded into XmlDocument?DataSet 可以加载到 XmlDocument 中吗?
【发布时间】:2021-05-04 01:14:00
【问题描述】:

我看到来自 Microsoft here 的代码示例如何将 DataSet 对象转换为 XmlDataDocument 以更好地使用 XML,但此类将被弃用。

这意味着我们或许应该使用 XmlDocument 类,但我们可以将 DataSet 转换为 XmlDocument 吗?

这是感兴趣的代码部分:(基本上我想提取某些节点)

XmlDataDocument xmlDoc = new XmlDataDocument(dataSet);

XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes(  
  "descendant::Customers[*/OrderDetails/ProductID=43]");  
  
DataRow dataRow;  
foreach (XmlNode xmlNode in nodeList)  
{  
  dataRow = xmlDoc.GetRowFromElement((XmlElement)xmlNode);  
  if (dataRow != null)  
    Console.WriteLine(dataRow[0]);  
} 

【问题讨论】:

  • 每个 XML 都是不同的。没有看到 xml 样本,我无法判断解析 xml 数据需要哪些方法。
  • 这与我在this 问题中发布的 XML 相同,但我什至无法进入此处的 xml 部分,因为我得到空引用异常。我认为这是从 XML 加载特定数据部分的好方法,例如在这种情况下 Benchmark/Group
  • 您是否使用了我在链接中的回答?哟可以使用DataSet方法ReadXml:DataSet ds = new DataSet(); ds.ReadXml(fileName) 读取的 xml 不适用于具有很多层次结构的 XML。所以我想你想用我的代码来解析xml,然后将解析后的数据加载到DataSet中。或者修改我的代码,将解析后的 xml 放入 DataSet 而不是类。
  • @zar - 该问题的 XML 被截断。而且即使我在最后添加缺少的两个节点,也无法加载到DataSet,见dotnetfiddle.net/gIwE73
  • 这是XY problem吗? DataSetDataTable 有相当丰富的工具可以直接运行查询,参见 Query datasets, Cross-Table Queries (LINQ to DataSet),

标签: c# xml dataset


【解决方案1】:

您可以通过creating an XPathNavigator 直接向XmlDocument 写入文档,然后通过writingDataSet 直接写入AppendChild(),如下所示:

var doc = new XmlDocument();
var navigator = doc.CreateNavigator();
using (var writer = navigator.AppendChild())
{
    dataSet.WriteXml(writer);
}           

但是,如果您仍然要重写代码,则应考虑从轻松支持 LINQ 查询和 XPath 查询的 LINQ to XML 升级到 XDocument

var doc = new XDocument();
using (var writer = doc.CreateWriter())
{
    dataSet.WriteXml(writer);
}           

任何一个选项都比将DataSet 序列化为 XML 字符串然后解析字符串更高效。

注意事项:

  • XmlDataDocument 不同,XmlDocumentXDocumentDataSet 之间没有动态链接。创建后对其中一个的更改不会反映在另一个中。

  • 您可能会考虑是否真的需要将 XML 读入 DataSetXDocument / XmlDocument。考虑使用其中一种来简化您的设计,但不能同时使用。

演示小提琴here.

【讨论】:

  • 是的,它是一个新代码,因此 LINQ to XML 方法听起来不错,但部分原因是为了更好地学习 XML/C#。我想加载 XML 文件并对其进行更改并重新保存它。这应该没问题,正确使用 C# 维护 XML 文档并仅向用户提供适用的数据,他们可以在其中进行更改并保存回 XML?除非出于某些原因,如果 XML 文件主要用于加载数据。
  • 如果您想创建一个可以加载、修改并保存一些 XML 的应用程序,那么 LINQ to XML 是一个不错的选择。它比XmlDocument 更高效,并且命名空间的处理更容易。它对于学习 LINQ 和 XPath 也很有用。但就使用 C# 维护 XML 文档并仅向用户提供可更改和保存的适用数据而言,这是一个相当广泛的要求,我们不需要更多关于您所需 UI 的详细信息推荐任何东西。
  • 是的,这将是学习 LINQ 和 XPath 的好方法,这是一个目标。此外,我还想创建一个应用程序,在其中显示以 XML 提供的 stigs 项目(我在此 [post]() 中提供了一个示例文件)。提供这些的 DoD 站点没有 标签(这是有道理的)。我想注入这个 标签,用户可以在其中保存有关每个 stig 项目的 cmets。这就是我想保存它的原因。
  • 我的策略是,当我读取 stig 文件时, 标签显然不存在,因此 C# 代码会读取 null 来表示评论,但是当用户保存文件时, 标签将是如果有的话,保存在现在包含用户 cmets 的项目中。这就是我的计划。够公平吗?
  • 我不同意上面的回答。 DataTable 是一个二维对象,DataSet 是多个 DataTable 的列表。您的 xml 不是二维的,因此您不能使用一个标准对象来读取您的复杂 XML。在您之前的帖子中,我已经将您的 XML 解析为二维类。现在你所要做的就是接受我的解析并放入表格中。上面的建议只是重复我已经做过的。
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2011-10-18
  • 2020-04-29
  • 1970-01-01
  • 2010-12-29
  • 2010-09-05
相关资源
最近更新 更多