无法使用 lxml 读取和查询 graphml 文件

Can't read and query graphml file with lxml

提问人:user32882 提问时间:11/1/2023 更新时间:11/1/2023 访问量:16

问:

我有一个 XML (GraphML) 文件,其松散定义如下:

<?xml version="1.0" encoding="utf-8"?>
<graphml xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/3.0" xmlns:y="http://www.yworks.com/xml/yfiles-common/3.0" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml.wpf/3.0/ygraphml.xsd " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://graphml.graphdrawing.org/xmlns">
    <key .... />
    <key .... />
    <key .... />
    <key .... />
    <data .. />
    <data .. />
    <graph id="G">
        <node id=".."></node>
        <node id=".."></node>
        <node id=".."></node>
        <node id=".."></node>
        <edge id=".."></edge>
        <edge id=".."></edge>
        <edge id=".."></edge>
    </graph>
</graphml>

我有兴趣检索 python 列表中的所有元素以进行进一步处理。这是我到目前为止尝试过的:node

from lxml import etree

tree = etree.parse("test1.graphml")
nodes = tree.findall('//graphml/node')

print("done")

但是,这不起作用,我不知道为什么。我在这里做错了什么?

python xml lxml 图形

评论


答:

0赞 user32882 11/1/2023 #1

在这种情况下,了解命名空间非常重要:

from lxml import etree

tree = etree.parse("test1.graphml")
root = tree.getroot()
namespaces = root.nsmap

nodes = root.findall('.//ns:node', namespaces={'ns': namespaces[None]})

print("done")