DataSet.ReadXml(TextReader)如何处理嵌套的XML元素?

时间:2014-03-28 18:29:26

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

我是一名PHP程序员,我正在尝试理解一些我认为是ASP.NET的代码。这也是我第一次涉足XML。我无法访问要测试的Windows框。

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

当前XML的结构非常 flat 。只有少数嵌套元素,第三方不使用任何嵌套元素。第三方确实有一个分包的程序员,但他很忙。另外,我想了解一下这是如何运作的。

这是自定义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文件读入DataSet
  • 按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创建多个元素以保持平面结构。但我认为嵌套结构对于这种数据是有意义的。问题是我不明白这种结构变化是否与插件代码兼容。

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

1 个答案:

答案 0 :(得分:1)

我自己也对此感到难过,我不知道你是否仍然存在,但是我在这里找到了其他人的参考资料。

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

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

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