迭代多个链接的XML文档的最佳方法

时间:2018-01-22 20:10:22

标签: xml vb.net

我有一大堆XML文档,让我们说3000个文件。在这些文件中是用于构建交互式文档的结构,其中每个页面都具有到其他页面的链接。我的问题是我需要根据链接标记和其中包含的属性找到正确的项目顺序。我遇到的一个问题是我需要以正确的顺序将它们拉出来,并且每个XML文档中都可以有多个链接,每个链接都会导致文档中包含更多链接。

这些文件需要按以下顺序排列。

DocA.XML有4个链接,DocB.XML,DocC.XML,DocD.XML和DocE.XML

如果这4个文档中没有其他链接,那么这很简单,我只需从DocA中取出所有节点并执行For Each并将4个文档的名称弹出到我的表中。问题是这些文件中有更多的链接。

让我们说......
DocB有3个链接(DocF,DocG,DocH)
DocC有2个链接(DocI,DocJ)
DocD没有链接
DocE有1个链接(DocK)

现在...
DocF有2个链接(DocL,DocM)
DocJ有3个链接(DocL,DocN,DocO)
DocK有2个链接(DocL,DocO)

其余的没有链接。我在那里扔了一些副本,因为这是一个常见的问题而且他们并不总是需要被展示,但我会稍后再说。

所以我需要提取这些文件的结构如下:

DOCA
- DocB
- DocF
--- DocL
--- DocM
- DocG
- DocH
- DocC
- DocI
- DocJ
--- DocN(DocL被跳过,因为它已经存在)
--- DocO
- DocD
- DocE(最终因为DocL和DocO已存在)

我需要在VB.NET中找到一种方法来遍历这些文档并搜索其中的任何链接以确定正确的顺序,如上所示。这些链接最多可以包含12个以上的文件,只是链接到另一个文档。

目前我有一种可怕的方法可以做到这一点......

Dim xInstall As XmlNodeList = xDoc.SelectNodes("//install/link")

For Each xInstallNode As XmlNode In xInstall
    Dim xAttr As XmlAttribute = CType(xInstallNode.Attributes.GetNamedItem("xlink:href"), XmlAttribute)

    If xAttr IsNot Nothing Then
        Dim strLink As String = xInstallNode.Attributes("xlink:href").InnerText
        Dim strTaskDesc As String = xInstallNode.SelectSingleNode("prompt").InnerText

        Add_Subtask(intCount, strTaskDesc, strLink, 0, "Install")

        For m As Integer = 1 To 25
            For n As Integer = 0 To intCount
                Process_Next_Install(n)
            Next
        Next
    End If
Next xInstallNode
  • Add_Subtask只是将信息添加到表中,增量为intCount。
  • Process_Next_Install是表格中每个项目的位置,与上述方法完全相同,但有一些额外的步骤可以忽略重复项等。
  • intCount是要添加的项目的ID。
  • Add_Subtask中的0是父ID,所以第一个是0,当我在Process_Next_Install方法中调用Add_Subtask时,我用' n'来调用它。作为父母。

我已经尝试在表中执行For Each项目,但因为表格不断被添加到.NET中并不理解并且告诉我我不能遍历动态表格。有道理,它可以永远地继续下去。

最后,我的问题是迭代这些文档的最佳方法是什么,了解我不知道结局在哪里以及我是否需要按特定顺序使用它们?

我正在努力弄清楚我的Do Until应该是什么,因为重复会让你很难知道你什么时候结束"最后#34;。

为冗长的问题道歉。希望我能够为某人提供足够的信息,以了解我在寻找什么。在这一段时间里,我一直把头靠在墙上。我所使用的代码,它可以获得我需要的一切,但是它很慢,并且有一个硬编码的' 25'或者任何数字都不是正确的方法。我知道必须有更好的方法。

1 个答案:

答案 0 :(得分:1)

考虑recursion。以下伪代码应该让你开始。

Sub My_Install(xInstall as ...)
    For each xInstallNode in xInstall
        Add_SubTask(...)
        For each (<xInstallLinked = linked file returned as XMLNodeList>)
            My_Install(xInstallLinked)
        Next
    Next
End Sub

显然我已经错过了很多细节,你也应该检查循环(否则可能需要很长时间才能运行!)。在上面的示例代码中,循环for m = 1 to 25除了运行相同的代码25次之外没有实现任何东西 - 或者这只是一个选择性编辑的例子来为这个论坛做一个简短的例子?