微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在打印 nodeName 时会弹出无关的文本?

如何解决为什么在打印 nodeName 时会弹出无关的文本?

假设,我有以下 XML 文件

<?xml version="1.0" encoding="utf-8"?>
<library attrib1="att11" attrib2="att22">
    library-text
    <book isbn="1111111111">
        <title lang="en">T1 T1 T1 T1 T1</title>
        <date>2001</date>
        <author>A1 A1 A1 A1 A1</author>     
        <price>10.00</price>
    </book>
    <book isbn="2222222222">
        <title lang="en">T2 T2 T2 T2 T2</title>
        <date>2002</date>
        <author>A2 A2 A2 A2 A2</author>     
        <price>20.00</price>
    </book>
    <book isbn="3333333333">
        <title lang="en">T3 T3 T3 T3</title>
        <date>2003</date>
        <author>A3 A3 A3 A3 A3y</author>        
        <price>30.00</price>
    </book>
</library>

ma​​in.py

import xml.dom.minidom as minidom

xml_fname = "library.xml"

dom = minidom.parse(xml_fname) 

for node in dom.firstChild.childNodes:
    print(node.nodeName)

输出

#text
book
#text
book
#text
book
#text

为什么输出显示#text?它来自哪里?

解决方法

如果您将 print(node.nodeName) 更改为 print(node),您将看到输出

<DOM Text node "'\n    libra'...">
<DOM Element: book at 0x11f48ec8>
<DOM Text node "'\n    '">
<DOM Element: book at 0x11f50070>
<DOM Text node "'\n    '">
<DOM Element: book at 0x11f501d8>
<DOM Text node "'\n'">

minidom 将“自由文本”“节点”视为名称为 #text 的实际无名 DOM 文本节点。

如果您只想要 book 节点,请明确说明:

for node in dom.getElementsByTagName('book'):
    print(node.nodeName)

输出

book
book
book

请记住,不鼓励使用 minidom。来自official Python docs

尚未精通 DOM 的用户应考虑改用 xml.etree.ElementTree 模块进行 XML 处理。

考虑使用 ElementTree

import xml.etree.ElementTree as ET

xml_fname = "library.xml"

root = ET.parse(xml_fname)

for node in root.findall('book'):
    print(node.tag)

也输出

book
book
book

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。