【问题标题】:Iterating through a multi-level XML file遍历多级 XML 文件
【发布时间】:2019-10-13 00:50:02
【问题描述】:

假设一个 XML 文件具有以下结构(如下)。所有不同深度的“家庭”节点都位于“根”元素下。 (对可能的不正确术语表示歉意;此 XML 内容的新内容。)

在“Family”节点下,有“Ancestors”或世代的层级。所以在下面的例子中,“大卫”(1级)有一个父亲叫“塞缪尔”(2级),他有一个父亲叫“弗雷德”(3级),等等。

有多个“家庭”节点。每个家族可能有不同数量的“祖先”层。在下面的示例中,“祖先”的深度为 5 代。其他“家庭”节点可能是 3 代深或 8 代深。每个“家族”节点的世代数未知。

我需要这样显示名称:

David ->Samuel->Fred->John->Frank->Robert  (for a 5 generation list)
Mary->Lisa->Karen  (for a 3 generation list)

所以我需要遍历每个家庭节点,就像家庭一样“深”(“世代”的数量),并生成一个像上面一样的名称列表。每个家庭的世代数可能不同。

 <root>
    <Family>
        <ID>7588784011</ID>
        <Name>David</Name>
        <Ancestors>
            <Family>
                <ID>157050011</ID>
                <Name>Samuel</Name>
                <Ancestors>
                    <Family>
                        <ID>157028011</ID>
                        <Name>Fred</Name>
                        <Ancestors>
                            <Family>
                                <ID>154606011</ID>
                                <Name>John</Name>
                                <Ancestors>
                                    <Family>
                                        <ID>133141011</ID>
                                        <Name>Frank</Name>
                                        <IsCategoryRoot>1</IsCategoryRoot>
                                        <Ancestors>
                                            <Family>
                                                <ID>133140011</ID>
                                                <Name>Robert</Name>
                                            </Family>
                                        </Ancestors>
                                    </Family>
                                </Ancestors>
                            </Family>
                        </Ancestors>
                    </Family>
                </Ancestors>
            </Family>
        </Ancestors>
    </Family>
    <Family>
        // more ancestors of a varying number
    </Family>
 </root>

谢谢。

已添加

我在这方面取得了一些进展,代码如 My code is here https://3v4l.org/GV0UV 所示。该代码具有 XML 内容,家庭成员的姓名以每个家庭的不同数字开头。

我得到每个家庭成员输出的名字,但所有名字都在一行上。目的是让每个家族的名字都显示在单独的一行上。

所以我需要在家庭发生变化时插入&lt;br&gt;

【问题讨论】:

    标签: arrays xml


    【解决方案1】:

    这归结为基础计算机科学。您有一个递归树结构,并且要操作它,您通常需要使用递归树遍历算法。这就是为什么许多人认为 XSLT 是处理 XML 的最简单解决方案的原因,因为递归树遍历模式内置于其处理模型中(xsl:apply-templates 和模板规则)。

    但是你可以用任何现代编程语言做同样的事情。基本构建块是一个功能:

    function process(element X) {
      do something with X
      for each child C of X {
         process(C)
      }
      do something more with X
    }
    

    不幸的是,XML 树的术语与您的家族树的术语发生冲突,因为您使用 XML 中的子节点来表示您家族中的祖先。这只是需要注意的事情,以免您感到困惑。

    由于您的树实际上并没有分支(似乎没有人有多个直系祖先),因此实际上可以简化解决方案;在 XPath 2.0 中,它只是 string-join(//Name, '-&gt;')。但也许这是在利用您的示例的一个属性,该属性不能推广到真实数据。

    【讨论】:

    • 有点帮助,但似乎不适用于具有不同“深度”的节点。请参阅有关我想要获得的输出的问题。我提供的示例 xml 类似于实际的 XML 文件(来自 Amazon API 输出)。
    • 请出示您的无效代码(最好在新问题中),然后我们可以帮助您查看哪里出错了。
    • 我的代码在这里3v4l.org/GV0UV。输出应在单独的行上显示每个“家庭”。 (每组家族的名称都以相同的数字开头。XML 是代码的一部分。)。
    猜你喜欢
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2012-07-12
    相关资源
    最近更新 更多