在前一篇 Unmi 学习 Groovy 之 GroovyMarkup (一) 引入了 GroovyMarkup 及介绍了其中的一个 Builder(MarkupBuilder) 的用法。本篇继续。
groovy.util.NodeBuilder,用来创建一般任意对象的树状结构。看到了,它不在 groovy.xml 包之下,但它是一个 Builder,所以秉承了 Builder 的语法规则,而且还可用路径(对象导航)的方式来访问这个 Builder 实例中的节点或属性值。还是来看例子:
1 2 3 4 5 6 7 8 9 10 11 12 |
import groovy.util.NodeBuilder; someBuilder = new NodeBuilder(); //只有这么一个构建方法 root = someBuilder.users([balance:100]){ //这一块的语法完全同 MarkupBuilder user([gender:"male"],"Unmi"); user("Joe"){ order(item:"Book"); } } println root; //因为 NodeBuilder 不预示着输出,所以需要显示的 println |
看看上面程序的输出:
users[attributes={balance=100}; value=[user[attributes={gender=male}; value=Unmi], user[attributes={}; value=[Joe, order[attributes={item=Book}; value=[]]]]]]
再来看看如何访问 root 的属性、节点、以及节点属性值,像访问 DOM 一样,并且更灵活:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
import groovy.util.NodeBuilder; someBuilder = new NodeBuilder(); //只有这么一个构建方法 root = someBuilder.users([balance:100]){ //这一块的语法完全同 MarkupBuilder user([gender:"male"],"Unmi"); user("Joe"){ order(item:"Book"); } } println root; //因为 NodeBuilder 不预示着输出,所以需要显示的 print println("-----访问节点-----"); //--get() 方法返回包含指定名称的所有子节点 users = root.get("user"); //就像 DOM 的 getElementsByTagName("user") //--用路径(导航)的方式访问节点 //users = root.user; //同 root.get("user") users.each(){ println "${it.name()}:${it.value()}"; //用 name() 和 value() 分别访问节点的名称和值 } println("-----访问属性-----"); //--attributes() 方法返回节点属性的一个 Map println root.attribute("balance"); println root.get("@balance"); //也可以用 @ 加属性名来取得属性值 println("-----深度优先遍历节点-----"); root.depthFirst().each(){ println "${it.name()}:${it.attributes()}"; } println("-----广度优先遍历节点-----"); root.breadthFirst().each(){ println "${it.name()}:${it.value()}"; } println("用 Java 迭代器来遍历一个节点的子节点"); it = root.iterator(); while(it.hasNext()){ println it.next(); } |
上面代码的输出如下,对照输出可很好的理解:
users[attributes={balance=100}; value=[user[attributes={gender=male}; value=Unmi], user[attributes={}; value=[Joe, order[attributes={item=Book}; value=[]]]]]]
-----访问节点-----
user:Unmi
user:["Joe", order[attributes={item=Book}; value=[]]]
-----访问属性-----
100
100
-----深度优先遍历节点-----
users:["balance":100]
user:["gender":"male"]
user:[:]
order:["item":"Book"]
-----广度优先遍历节点-----
users:[user[attributes={gender=male}; value=Unmi], user[attributes={}; value=[Joe, order[attributes={item=Book}; value=[]]]]]
user:Unmi
user:["Joe", order[attributes={item=Book}; value=[]]]
order:[]
用 Java 迭代器来遍历一个节点的子节点
user[attributes={gender=male}; value=Unmi]
user[attributes={}; value=[Joe, order[attributes={item=Book}; value=[]]]]
参考:1. 《Java 脚本编程 语言、框架与模式》 第五章,高级的 Groovy 编程
本文链接 https://yanbin.blog/unmi-study-groovy-markup-2/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。