python使用dom获取节点对之间的值

RunningBComeOn 2020-05-02 12:41:10
数据文件gxl111.xml如下:

<?xml version="1.0"?>
<!DOCTYPE gxl SYSTEM "http://www.gupro.de/GXL/gxl-1.0.dtd">
<gxl>
<graph id="molid180" edgeids="false" edgemode="undirected">
<node id="_1">
<attr name="symbol">
<string>C </string>
</attr>
<attr name="chem">
<int>1</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>3.7321</float>
</attr>
<attr name="y">
<float>1.25</float>
</attr>
</node>
<node id="_2">
<attr name="symbol">
<string>O </string>
</attr>
<attr name="chem">
<int>2</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>4.5981</float>
</attr>
<attr name="y">
<float>1.75</float>
</attr>
</node>
<node id="_3">
<attr name="symbol">
<string>O </string>
</attr>
<attr name="chem">
<int>2</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>2.866</float>
</attr>
<attr name="y">
<float>1.75</float>
</attr>
</node>
<node id="_4">
<attr name="symbol">
<string>C </string>
</attr>
<attr name="chem">
<int>1</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>3.7321</float>
</attr>
<attr name="y">
<float>0.25</float>
</attr>
</node>
<node id="_5">
<attr name="symbol">
<string>C </string>
</attr>
<attr name="chem">
<int>1</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>2.866</float>
</attr>
<attr name="y">
<float>-0.25</float>
</attr>
</node>
<node id="_6">
<attr name="symbol">
<string>C </string>
</attr>
<attr name="chem">
<int>1</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>4.5981</float>
</attr>
<attr name="y">
<float>-0.25</float>
</attr>
</node>
<node id="_7">
<attr name="symbol">
<string>O </string>
</attr>
<attr name="chem">
<int>2</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>2</float>
</attr>
<attr name="y">
<float>0.25</float>
</attr>
</node>
<node id="_8">
<attr name="symbol">
<string>C </string>
</attr>
<attr name="chem">
<int>1</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>2.866</float>
</attr>
<attr name="y">
<float>-1.25</float>
</attr>
</node>
<node id="_9">
<attr name="symbol">
<string>C </string>
</attr>
<attr name="chem">
<int>1</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>4.5981</float>
</attr>
<attr name="y">
<float>-1.25</float>
</attr>
</node>
<node id="_10">
<attr name="symbol">
<string>C </string>
</attr>
<attr name="chem">
<int>1</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>3.732</float>
</attr>
<attr name="y">
<float>-1.75</float>
</attr>
</node>
<edge from="_1" to="_2">
<attr name="valence">
<int>2</int>
</attr>
</edge>
<edge from="_1" to="_3">
<attr name="valence">
<int>1</int>
</attr>
</edge>
<edge from="_1" to="_4">
<attr name="valence">
<int>1</int>
</attr>
</edge>
<edge from="_4" to="_5">
<attr name="valence">
<int>2</int>
</attr>
</edge>
<edge from="_4" to="_6">
<attr name="valence">
<int>1</int>
</attr>
</edge>
<edge from="_5" to="_7">
<attr name="valence">
<int>1</int>
</attr>
</edge>
<edge from="_5" to="_8">
<attr name="valence">
<int>1</int>
</attr>
</edge>
<edge from="_6" to="_9">
<attr name="valence">
<int>2</int>
</attr>
</edge>
<edge from="_8" to="_10">
<attr name="valence">
<int>2</int>
</attr>
</edge>
<edge from="_9" to="_10">
<attr name="valence">
<int>1</int>
</attr>
</edge>
</graph>
</gxl>


我的需求:
提取每个节点node标签下的,name="symbol"时的标签值,例如下面的节点,提取出'C'。将每个标签的symbol信息放在列表中。即Node_symbol = ['C', 'O', 'O', 'C'.......],但是现在打印出来是空的。

<node id="_1">
<attr name="symbol">
<string>C </string>
</attr>
<attr name="chem">
<int>1</int>
</attr>
<attr name="charge">
<int>0</int>
</attr>
<attr name="x">
<float>3.7321</float>
</attr>
<attr name="y">
<float>1.25</float>
</attr>
</node>


我的代码如下:

from xml.dom.minidom import parse
import xml.dom.minidom
import pandas as pd

file_path = r'gxl1111.xml'
DOMTree = xml.dom.minidom.parse(file_path)
collection = DOMTree.documentElement

#在集合中获取所有顶点
nodes = collection.getElementsByTagName("node")

#用列表存放获取的顶点信息
Node_from = []
Node_symbol = []
for node in nodes:
if node.hasAttribute("id"):
pattern = re.findall(r'(\d)' ,node.getAttribute("id") )
pattern = [str(j) for j in pattern]
pattern = ''.join(pattern)
node_id = pattern
Node_from.append(node_id)
if node.hasAttribute("symbol"):
Node_symbol.append(node.getAttribute("symbol"))

#将列表元素string类型转变为整形
Node_from=list(map(int,Node_from))
print(Node_from)
print(Node_symbol)


代码的问题:可以输出id,因为id是节点的属性值,但是"symbol"是其孩子节点的属性值。我不晓得怎么办了,思路很混乱。去网上找了很多教程,怎么也写不出来"symbol的值。希望能够指点一二。
...全文
127 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,424

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧