使用 etree 在 xml 文件中查找所有出现的内部文本
Find all occurences of inner text in an xml file with etree
我是 python 和树的新手,遇到了一些问题。
我的数据集结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
<node id="node1">
<data key="label">node1</data>
<data key="degree">6</data>
</node>
<node id="node2">
<data key="label">node2</data>
<data key="degree">32</data>
</node>
<node id="node3">
<data key="label">node3</data>
<data key="degree">25</data>
</node>
</graphml>
我希望能够使用 etree 访问并打印 元素的所有内部文本。换句话说得到以下结果:
"node1"
"node2"
"node3"
我试过 itertext() 没有成功 (https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.itertext),还有错误的 xpath 表达式。
我相信有一个简单的解决方法,希望大家能帮忙!
您可能忘记了名称空间。尝试这样的事情:
import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)
ns = {'graphml': 'http://graphml.graphdrawing.org/xmlns'}
for element in root.findall(".//graphml:node[@id]",ns):
print(element.attrib['id'])
这会在 python 2.7 上完成工作:
import xml.etree.ElementTree as ET
root = ET.fromstring(data)
elts = root.findall('.//*[@key="label"]')
for e in elts:
print(e.text)
我是 python 和树的新手,遇到了一些问题。
我的数据集结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
<node id="node1">
<data key="label">node1</data>
<data key="degree">6</data>
</node>
<node id="node2">
<data key="label">node2</data>
<data key="degree">32</data>
</node>
<node id="node3">
<data key="label">node3</data>
<data key="degree">25</data>
</node>
</graphml>
我希望能够使用 etree 访问并打印 元素的所有内部文本。换句话说得到以下结果:
"node1"
"node2"
"node3"
我试过 itertext() 没有成功 (https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element.itertext),还有错误的 xpath 表达式。
我相信有一个简单的解决方法,希望大家能帮忙!
您可能忘记了名称空间。尝试这样的事情:
import xml.etree.ElementTree as ET
root = ET.fromstring(countrydata)
ns = {'graphml': 'http://graphml.graphdrawing.org/xmlns'}
for element in root.findall(".//graphml:node[@id]",ns):
print(element.attrib['id'])
这会在 python 2.7 上完成工作:
import xml.etree.ElementTree as ET
root = ET.fromstring(data)
elts = root.findall('.//*[@key="label"]')
for e in elts:
print(e.text)