繁体   English   中英

XML文档树遍历

[英]XML Document tree traversal

我正在尝试在Mac上使用处理3创建生命进化的视觉表示-我正在使用XML来组织树状数据。 这是我组织XML代码的方式:

<?xml version="1.0"?>
<A>
    <animal>Bacteria</animal>
    <B>
        <animal>Archea</animal>
        <C>
            <animal>Foraminifera</animal>
            <D>
                <animal>Green Algae</animal>
                <E>
                    Mosses
                </E>
            </D>
            <J>
                <animal>Yeast</animal>
                <animal>Sponges</animal>
                <animal>Corals</animal>
                <K>
                    <L>RoundWorms</L>
                    <V>SchinoDerms</V>
                </K>
            </J>
        </C>
    </B>
</A>

字母表示时间上的分支,“动物”标签是在特定时间段内存在的动物(我必须添加更多信息,例如“时间”,但我想先解决此问题)。

我正在尝试遍历XML文档,但无法弄清楚如何比第一个子节点(“ B”)更进一步。 最后,我希望这类似于一个断点树,其中动物从各自的时间段分支出来(“细菌”从断点“ A”分支出来,“阿奇亚”从断点“ B”分支出来,等等。)

我想,如果我能弄清楚如何超过第一个孩子,我一定会准备就绪-有什么想法吗?

您应该从示例>主题>高级数据下的XML参考和示例开始,例如LoadSaveXML / XMLYahooWeather。

您可以通过调用返回XML数组的getChilren()来对节点进行基本遍历。 在此阶段,应该足够简单,以遍历此数组并在此级别访问每个子XML实例的数据:

XML xml;
void setup(){

  xml = loadXML("data.xml");
  xml.trim();

  XML[] level0 = xml.getChildren();
  for(int i = 0; i < level0.length; i++){
    println("level0["+i+"]:" + level0[i]);
  }

}

注意1:上面的示例适用于处理3,但由于XML API更改(例如,可能缺少trim()函数),因此可能不适用于旧版本。 trim()函数应删除空格(换行,制表符等),否则,空行可能被视为XML节点。 由于XML中的空白,请务必进行检查以避免意外。

注意2 :此答案中的示例假定您发布的xml在尝试运行代码的草图文件夹中另存为data.xml。可以随意将其重命名为XML文件的实际名称。

好的,所以现在您进入第一级,但是如何进入下一级呢? 实际上还不错。 在遍历每个子XML节点时,您可以检查它是否具有hasChildren() ,在这种情况下,请重复前面的操作:

  1. 获取子级xml节点
  2. 遍历每个子xml节点

(在这个阶段,这将是“大”孩子:

XML xml;

void setup(){
  xml = loadXML("data.xml");
  xml.trim();

  XML[] level0 = xml.getChildren();
  for(int i = 0; i < level0.length; i++){
    println("level0["+i+"]:" + level0[i]);

    //we need to go deeper...but can we ?
    if(level0[i].hasChildren()){
      XML[] level1 = level0[i].getChildren();

      for(int j = 0; j < level1.length; j++){
          println("\tlevel1["+j+"]:" + level1[j]);
      }

    }
  }

}

您应该能够安全地重复该过程以进一步进行深入研究。

随着您的学习越来越深入,可以找到一些有趣的东西:递归函数。 如果您还不熟悉从头开始编写自己的函数,则应该先了解一下。

它们与变量有一些共同点:

  • 函数也有一个类型(称为返回类型)
  • 函数也有一个名字

但是主要要做的是一组指令。 根据这些指令的作用,它们可能会也可能不会返回结果,该结果决定了函数的类型。

最简单的是什么都不返回的函数(因此返回类型为void)。 您以前可能已经使用过void setup(){} ,对吗? :)

函数会创建一个单独的范围(在{}符号内),因此,在函数范围内定义的变量仅在此处可见,除非最后返回结果变量。

函数可以具有0个或多个参数/参数(请参阅选项)。 例如setup()不需要参数,但是point()需要两个(x和y)。

递归函数本质上只是一个调用自身的函数(通常使用不同的参数)。

对于XML,您可以使用递归函数深入所有级别:

XML xml;

void setup(){

  xml = loadXML("data.xml");
  xml.trim();

  recursiveTraverse(xml);
}

void recursiveTraverse(XML xml){
  XML[] childNodes = xml.getChildren();
  for(int i = 0; i < childNodes.length; i++){
    println(childNodes[i].getName()+":"+childNodes[i].toString());
    if(childNodes[i].hasChildren()){
      recursiveTraverse(childNodes[i]);
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM