【问题标题】:How does DataSet.ReadXml(TextReader) handle nested XML elements?DataSet.ReadXml(TextReader) 如何处理嵌套的 XML 元素?
【发布时间】:2014-05-08 08:56:47
【问题描述】:

我是一名 PHP 程序员,我正在尝试理解一些我认为是 ASP.NET 的代码。这也是我第一次涉足 XML。我无权使用 Windows 机器进行测试。

我需要生成第三方代码可以使用的 XML 输出。第三方想要使用我们的数据而不是他们当前使用的数据源。我不想完全复制当前的 XML 结构,因为它不能很好地映射到我们的数据。

当前 XML 的结构非常扁平。只有几个嵌套元素,第三方没有使用它们中的任何一个。第三方确实有分包程序员,但他很忙。另外,我想亲自了解一下这是如何工作的。

这是自定义 CMS 插件的摘录:

Dim obj_set As New Data.DataSet()
Using obj_reader As New System.Xml.XmlTextReader("http://www.example.com/xml_output.php")
  obj_set.ReadXml(obj_reader)
End Using
Dim obj_view As Data.DataView = obj_set.Tables("profile").DefaultView
obj_view.Sort = "cname"
Dim obj_data As Data.DataTable = obj_view.ToTable()

所以从我目前收集到的,这段代码

  • 将 XML 文件读入数据集
  • 按 cname 对配置文件表进行排序
  • 从排序视图创建一个新的 DataTable

还有其他代码将新表存储到缓存中并从中检索。然后是循环遍历表行并将列名映射到模板变量的代码。

当前 XML 结构的示例摘录:

<profiles>
  <profile>
    <cname>ABC Corporation</cname>
    <fname>John</fname>
    <lname>Smith</lname>
    <sector>Widgets</sector>
    <subsectors>
      <subsector>Basic Widgets</subsector>
      <subsector>Fancy Widgets</subsector>
    </subsectors>
  </profile>
</profiles>

那么subsectors 数据会发生什么?读者是否为它创建了一个单独的表?如果有,这些表是如何关联的?

我们的数据包括每个公司的多个联系人。我可以在顶层 fname1fname2fname3 创建多个元素以保持扁平结构。但我认为嵌套结构对于这种数据是有意义的。问题是我不明白这样的结构变化是否与插件代码兼容。

需要对插件代码进行哪些更改才能使用嵌套元素?

【问题讨论】:

    标签: c# asp.net xml xml-parsing


    【解决方案1】:

    我自己对此感到困惑,我不知道你是否仍然如此,但为了参考其他人,这是我发现的。

    您假设读者为它创建了一个单独的表是正确的。由于 DataSet 可以包含多个表,因此每个“级别”元素都有自己的表。但是,任何具有自己嵌套元素的嵌套元素都将获得自己的表格。本质上,它一直在创建表,直到到达 xml 树的底部。如果一个元素没有子元素,它将被添加为数据表中的一个单元格。

    在你的情况下, dataSet.Tables[0] 将保存顶级节点(所有 <.profiles>)。但由于嵌套元素 <.profile> 有自己的元素,Tables[0] 可能只有一行。更深一层,dataSet.Tables[1] 将保存所有 节点。虽然由于 <.subsectors> 有子元素 <.subsector>,它不会在 Tables[1] 中,而是在更深层次的 Tables[2] 中。

    我知道这个问题已经有一段时间了,但希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多