设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 3561|回复: 3
打印 上一主题 下一主题

使用minidom来解析xml, 无法得到属性, 元素的xml也只显示结束...

[复制链接]

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

跳转到指定楼层
楼主
发表于 2022-6-24 00:10:38 |只看该作者 |正序浏览
我有一段非常简单的xml, 想尝试获得元素的属性值.

testing.xml代码如下:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <catalog>
  3.    <aa value="first">this is the 1st.</aa>
  4.    <aa value="second">this is the 2nd.</aa>
  5. </catalog>
复制代码
用来解析的python代码如下, 我在其中做了结果标记:
  1. from xml.dom import minidom


  2. with minidom.parse('c:/desktop/testing.xml') as dom:
  3.     elements = dom.getElementsByTagName('aa')      

  4. print(f'There are {len(elements)} items')                    # 这个能正确的获得元素的数量

  5. print(elements[1])                                                   # 这个能打印类似这样的元素内存值: <DOM Element: aa at 0x2c864d264c0>
  6. print(elements[1].nodeType)                                     # 这个结果是1, 应该是element node
  7. print(elements[1].toprettyxml(encoding='utf-8'))         # 这个结果是b'<aa/>\n', 按理说是应该显示<aa value="second">this is the 2nd.</aa>
  8. print(elements[1].attributes['value'].value)                 # 这个提示是 error, KeyError 'value', 照理说应该是显示 second?
复制代码
我也查找了相关指引, 比如: https://stackoverflow.com/a/1912516/3127293, 我几乎是原样按照这里介绍的方式做的, 但是在我这里就是错误的.

我的环境是 windows + python3.9.10 + VScode

不知我的代码哪里出错了? 如何才能获得xml元素的某个属性的值呢?
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2022-6-24 22:23:27 |只看该作者
具体它这里的实现机制我没有深入了解
有可能它这里是一个引用,引用还是在的,但是引用对应的对象被关闭了,所以数量是对的,但要访问具体的值就拿不到了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

16

主题

1

好友

244

积分

中级会员

Rank: 3Rank: 3

板凳
发表于 2022-6-24 18:39:54 |只看该作者
恩, 放到with里面就对了. 真是感谢先生.

不过..

> 你这里用了 with 打开,with结束之后文件就被关闭了,相关的元素还没有被读取

如果with缩进的语句完成后就被关闭了
那为什么在缩进之外的 print(f'There are {len(elements)} items')   这个语句能读出正确的元素数量呢?

抱歉我基础知识不扎实,
盲点太多了, 希望先生能点拨一下.

感谢.

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2022-6-24 01:05:06 |只看该作者
这个问题很有意思,我也是查了半天才发现问题:

你这里用了 with 打开,with结束之后文件就被关闭了,相关的元素还没有被读取
所以,要么你把后面的代码缩进一层,全放在with里
要么不要用with语句,就正常parse后并赋值
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-21 20:45 , Processed in 0.014933 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部