[英]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() ,在这种情况下,请重复前面的操作:
(在这个阶段,这将是“大”孩子:
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.