【问题标题】:python lxml get the name of a nodepython lxml 获取节点的名称
【发布时间】:2015-07-22 22:05:08
【问题描述】:

这是我的 xml 文件:

<FuzzyComparison>
    <Modules>
        <Module>
            <name>AutosoukModelMakeFuzzyComparisonModule</name>
            <configurationLoader>DefaultLoader</configurationLoader>
            <configurationFile>MakesModels.conf</configurationFile>
            <settings></settings>
        </Module>
        <Module>
            <name>DefaultFuzzyComparisonModule</name>
            <configurationLoader>DefaultLoader</configurationLoader>
            <configurationFile>Buildings.conf</configurationFile>
            <settings>
                <attribute>building</attribute>
            </settings>
        </Module>
    </Modules>
    </FuzzyComparison>

这是我一直在尝试解析的代码:

from lxml import etree
class AttributesXMLParser():
    def __init__(self):
        self.doc=etree.parse('Items.xml')

    def getValueOfTag(self, tagName): #This function returns the value of a specific tag for exmaple, the tageName could be "FirstDate"
        return self.doc.find(tagName).text

    def loadFuzzySettings(self):
        modulesDict = list()
        modules = self.doc.findall('FuzzyComparison/Modules/Module')
        for module in modules:
            moduleDict = dict()
            moduleName = module.find('name').text
            moduleDict['name'] = moduleName
            moduleConfigurationLoader = module.find('configurationLoader').text
            moduleDict['configurationLoader'] = moduleConfigurationLoader
            moduleConfigurationFile = module.find('configurationFile').text
            moduleDict['moduleConfigurationFile'] = moduleConfigurationFile
            settings = module.findall('settings')
            settingsDict = dict()
            for oneSetting in settings:
                settingsDict[oneSetting] = oneSetting.text
            moduleDict['settings'] = settingsDict
            modulesDict.append(moduleDict)
        return modulesDict

这是结果:

[{'moduleConfigurationFile': 'MakesModels.conf', 'configurationLoader': 'Default
Loader', 'name': 'AutosoukModelMakeFuzzyComparisonModule', 'settings': {<Element
 settings at 0x25257c8>: None}}, {'moduleConfigurationFile': 'Buildings.conf', '
configurationLoader': 'DefaultLoader', 'name': 'DefaultFuzzyComparisonModule', '
settings': {<Element settings at 0x2525e48>: '\n\t\t\t\t'}}]

我的问题

我不知道如何获取 settings 节点的名称和值,因为正如您所见,除了 settings 之外,一切都运行良好,我需要这样:

"attribute": building

但我的代码给了我:

{<Element settings at 0x2525e48>: '\n\t\t\t\t'}}]

你能帮忙解决一下吗?

【问题讨论】:

    标签: python xml python-2.7 lxml


    【解决方案1】:

    由于findall() 返回一个列表,您希望迭代该列表元素的内容,而不是列表本身。您还希望使用元素的标签作为键,而不是使用元素本身。

    settingsDict = {}
    for settingsNode in module.findall('settings'):
        for setting in settingsNode:
            settingsDict[setting.tag] = setting.text
    

    或者,如果你只有一个settings 标签,

    settingsDict = {}
    for setting in module.find('settings'):
        settingsDict[setting.tag] = setting.text
    

    可以简化为:

    settingsDict = {setting.tag: setting.text
                    for setting in module.find('settings')}
    

    【讨论】:

    • 我只有一个settings标签,它会有很多值,请问有什么办法可以避免在settings标签上做findall
    • @MarcoDinatsoli:那为什么代码首先使用module.findall()?我注意到代码在其他地方使用了module.find()
    • 这是我的错误,但是,我现在尝试仅使用 find 并仅使用一个循环(而不是两个),但现在我在设置中得到空结果,没有任何内容被保存
    • 你可以自己试试代码,它是一个工作代码,你只需要运行它
    • 我实际上无法自己尝试代码,因为您更改了代码并且尚未发布更改。但我已经更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多