获取 XML 中的注释节点

Posted

技术标签:

【中文标题】获取 XML 中的注释节点【英文标题】:Get commented nodes in XML 【发布时间】:2022-01-20 22:21:25 【问题描述】:

环境:Python 3.9.7、Windows 10

如何获取注释节点的 XPATH?


示例 XML (ex.xml)

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E">AUS</neighbor>
        <!-- A1 -->
        <neighbor name="Switzerland" direction="W">SWI</neighbor>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <!-- B1 -->
        <neighbor name="Malaysia" direction="N"/>
    </country>
</data>

我的期望

import xml.etree.ElementTree as et

def parse_commented_nodes(root):
    """
    Returns something like
    
        "A1" : "./country[@name='Liechtenstein']/neighbor[@name='Austria']",
        "B1" : "./country[@nmae='Singapore']/gdppc"
    
    """
    return 

tree = et.parse("ex.xml")
root = tree.getroot()
res = parse_commented_nodes(root)

我的想法

    以文本形式读取文件。 查找评论之前的行。 从节点到根迭代地获取父节点。

但我在上述方法中“获得父母”时遇到了问题。例如,

annotated_node = root.find(".//neighbor[@name='Austria']")
print(annotated_node.find("..")) # None
print(annotated_node.find("./..")) # None

我已经搜索了使用 Python 的默认 xml 模块获取节点的父节点(或获取完整 XPATH)的方法,但找不到有效的方法。


How to read commented text from XML file in python

我的问题与上述类似,但不是重复的。它找到“cmets”,但我需要“cmets 之前的节点”。

【问题讨论】:

这能回答你的问题吗? How to read commented text from XML file in python OP 想要做的不仅仅是获取评论节点。 使用 lxml,注释节点很容易找到(使用.xpath('//comment()')),前面的兄弟节点也是如此(使用.getprevious())。使用.getparent() 获取节点的父节点。用 ElementTree 做这些事情并非不可能,但肯定更具挑战性。 为什么要知道 cmets 的 xpath? @mzjn 这对我来说是完美的。非常感谢。 【参考方案1】:

问题通过使用 lxml 作为@mzjn 建议解决。

from lxml import etree as et

def parse_commented_nodes(tree):
    res = 
    for node in tree.iter():
        if "function Comment" in str(node.tag):
            res[node.text] = tree.getpath(node.getprevious())
    return res

tree = et.parse("ex.xml")
res = parse_commented_nodes(tree)

【讨论】:

以上是关于获取 XML 中的注释节点的主要内容,如果未能解决你的问题,请参考以下文章

PHP、XML 获取记录节点和值并将它们放入 JSON 数组? [复制]

XML DOM

使用 SQL 获取 XML 节点中的值

如何通过 XML 中的 id 获取节点?

C#获取xml文档中的所有节点但忽略嵌套节点

如何从 xmlnodelist 获取 xml 节点