返回介绍

10.4. 查找节点的直接子节点

发布于 2019-09-14 13:30:41 字数 2461 浏览 1090 评论 0 收藏 0

10.4. 查找节点的直接子节点

解析 XML 文档时,另一个有用的己技巧是查找某个特定元素的所有直接子元素。例如,在语法文件中,一个 ref 元素可以有数个 p 元素,其中每一个都可以包含很多东西,包括其他的 p 元素。你只要查找作为 ref 孩子的 p 元素,不用查找其他 p 元素的孩子 p 元素。

你可能认为你只要简单的使用 getElementsByTagName 来实现这点就可以了,但是你不可以这么做。 getElementsByTagName 递归搜索并返回所有找到的元素的单个列表。由于 p 元素可以包含其他的 p 元素,你不能使用 getElementsByTagName ,因为它会返回你不要的嵌套 p 元素。为了只找到直接子元素,你要自己进行处理。

例 10.16. 查找直接子元素

    def randomChildElement(self, node):
        choices = [e for e in node.childNodes
                   if e.nodeType == e.ELEMENT_NODE] 1 2 3
        chosen = random.choice(choices)             4
        return chosen                              
1正如你在例 9.9 “获取子节点”中看到的, childNodes 属性返回元素所有子节点的一个列表。
2However, 正如你在例 9.11 “子节点可以是文本”中看到的,childNodes 返回的列表包含了所有不同类型的节点,包括文本节点。这并不是你在这里要查找的。你只要元素形式的孩子。
3每个节点都有一个nodeType属性,它可以是元素节点, 文本节点, 注释节点,或者任意数量的其它值。可能值的完整列表在xml.dom包的__init__.py文件中。(关于包更多的,参见第 9.2 节 “包”。)但你只是对元素节点有兴趣,所以你可以过滤出一个列表,其中只包含nodeType是元素节点的节点。
4一旦你拥有了一个真实元素的列表,选择任意一个都很容易。Python 有一个叫 random 的模块,它包含了好几个有用的函数。random.choice函数接收一个任意数量条目的列表并随机返回其中的一个条目。比如,如果 ref 元素包含了多个 p 元素,那么choices将会是 p 元素的一个列表,并且chosen将以被赋予其中的一个确切值而结束,而这个值是随即选择的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文