python - 如果特定属性匹配,则查找并提取 xml 标签的名称

标签 python python-3.x xml-parsing elementtree

如果列标记在 name 属性中具有 (group) 字符串,我想提取标记 column 的名称。我通过堆栈进行了研究,发现了一些提示,但按照这些提示我没有得到答案。更多信息如下。

示例 XML:

<datas>
    <data>
      <column datatype='real' default-format='c&quot;$&quot;#,##0;(&quot;$&quot;#,##0)' name='[Sales]' role='measure' type='quantitative' />
      <column datatype='real' default-format='c&quot;$&quot;#,##0;(&quot;$&quot;#,##0)' name='[Shipping Cost]' role='measure' type='quantitative' />
      <column datatype='string' name='[State]' role='dimension' semantic-role='[State].[Name]' type='nominal' />
      <column datatype='string' name='[Sub-Category (group)]' role='dimension' type='nominal'>
    </data>
</datas>

我的尝试:

#USING ELEMTREE, python3 to parse xml
columnfind = twbroot.findall('./datas/data')
for i in columnfind:
    select= i.("//*[contains(@name,'(group)')]")

最佳答案

xml.etree 模块仅支持limited subset XPath 1.0 的版本,其中不包括 contains()。所以你需要在 python 中进行“包含”检查:

columnfind = twbroot.findall('data/column')
for col in columnfind:
    if '(group)' in col.get('name'):
        print col.get('name')

或者:

cols = [e.get('name') for e in root.findall("data/column") if '(group)' in e.get('name')]
print(cols)

eval.in demo

如果您有能力使用lxml ,它具有完整的 XPath 1.0 支持,因此您可以直接在 XPath 中进行检查:

cols = [e.get('name') for e in root.xpath("data/column[contains(@name,'(group)')]")]
print(cols)

关于python - 如果特定属性匹配,则查找并提取 xml 标签的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49002831/

相关文章:

python - 如何使用 pymysql 运行批量插入查询?

python - 用 python 平均多个 netCDF4 文件

linux - 跨平台控制台清算?

python - 更新进度条变慢

python - 屏蔽 numpy 数组时出现 MemoryError

python - 模块未找到错误: No module named 'Cython' during pycocotools install after cython installation

html - BeautifulSoup findall 与名称列表没有找到另一个目标之后的目标

java - SAXParser - 从 XML 元素解码值后仅获得字符长度 126

xml - 如何返回 QDomDocument 中的根元素?

python - 如何让 BeautifulSoup 4 遵守自动关闭标签?