根据不同标记的属性提取XML标记数据

时间:2018-04-11 16:15:51

标签: python xml

我正在使用xml.etree来解析一些我需要用Python导入数据库的巨大XML文件,但出于某种原因,我无法弄清楚如何提取特定的标签基于不同标签的属性

例如,在下面包含的这段XML中,我需要提取NicamWarningCS标记下的标记文本,并将它们放在一个列表中。有关如何实现这一目标的任何建议?

git checkout myBranch
git tag temp
git reset --hard HEAD~2
git merge --no-commit master^
rm -rf *
git checkout temp^ -- .
git add .
git commit -m"new commit message for D"
git merge --no-commit master
rm -rf *
git checkout temp -- .
git add .
git commit -m"commit message for F"

3 个答案:

答案 0 :(得分:2)

以下是我要做的详细程序:

import xml.etree.ElementTree as ET

# 1. Parse your xml file
tree = ET.parse('your.xml')

# 2. Get the root
root = tree.getroot()

# 3. Set the tag and attribute you are looking for
ns = 'urn:tva:metadata:2004'
matchTag = 'NicamWarningCS'

# 4. retrieve all Genres
genres = root.find('{%s}ProgramDescription' % ns) \
    .find('{%s}ProgramInformationTable' % ns) \
    .find('{%s}ProgramInformation' % ns) \
    .find('{%s}BasicDescription' % ns) \
    .findall('{%s}Genre' % ns)

# 5. filter them in order to get just the Names of the ones that match your matchTag : 'NicamWarningCS'
filteredGenreNames = [genre.find('{%s}Name' % ns) for genre in genres if matchTag in genre.get('href')]

# 6. extract the text of the tags
data = [t.text for t in filteredGenreNames]

print(data)
# ['Grof taalgebruik', 'Geweld']

答案 1 :(得分:1)

只需获取所有Genre个元素,然后过滤那些您感兴趣的href属性的元素:

ns = 'urn:tva:metadata:2004'
all_genres = fromstring(xml) \
    .find('{%s}ProgramDescription' % ns) \
    .find('{%s}ProgramInformationTable' % ns) \
    .find('{%s}ProgramInformation' % ns) \
    .find('{%s}BasicDescription' % ns) \
    .findall('{%s}Genre' % ns)
some_genres = [g for g in all_genres if 'NicamWarningCS' in g.get('href')]

答案 2 :(得分:0)

我无法快速启动并运行Erik的答案,但它向我暗示了一个能够解决我问题的不同解决方案。

通过创建包含所有类型的dict,我能够过滤掉所有Nicam警告并将它们添加到一个列表中,然后我可以用它来填充我的SQL语句:

.open

它可能不是最好的解决方案,但现在这样做。