Python 即使xml_attribs=True,属性也不会出现在xml2dict解析输出中

Python 即使xml_attribs=True,属性也不会出现在xml2dict解析输出中,python,xml,attributes,xmltodict,Python,Xml,Attributes,Xmltodict,我对python xmltodict有问题。按照几乎一致的建议,我尝试了xmltodict,并且非常喜欢它,直到我必须访问处理程序顶层的属性。我可能做错了什么,但我不清楚是什么。我有一个xml文档,看起来像这样 <api> <cons id="79550" modified_dt="1526652449"> <firstname>Mackenzie</firstname> ... </cons> <cons id="79551"

我对python xmltodict有问题。按照几乎一致的建议,我尝试了xmltodict,并且非常喜欢它,直到我必须访问处理程序顶层的属性。我可能做错了什么,但我不清楚是什么。我有一个xml文档,看起来像这样

<api>
<cons id="79550" modified_dt="1526652449">
<firstname>Mackenzie</firstname>
...
</cons>
<cons id="79551" modified_dt="1526652549">
<firstname>Joe</firstname>
...
</cons>
<api>
其中
apireult.body
包含上面显示的xml。但是,尽管有
xml\u attribs=True
,但在处理程序中解析后,我在输出中没有看到
@id
@modified\u dt
,尽管原始文件中的所有元素都出现了

处理程序的编码如下所示:

def handler(_, cons):
    print (cons)
    mc = MatchChecker(cons)
    mc.check()
    return True
我可能做错了什么


我也尝试过xmljson,但如果我有办法解决这个问题的话,我马上就不喜欢它了。是否有人有解决此问题的方法或包可以更好地处理此问题?

xmltodict
工作正常,但您正在解析参数
item\u depth=2
,这意味着您的处理程序将只看到
元素内部的元素,而不是
元素本身

xml = """
<api>
<cons id="79550" modified_dt="1526652449">
<firstname>Mackenzie</firstname>
</cons>
</api>
"""

def handler(_,arg):
    for i in arg.items():
        print(i)
    return True

xmltodict.parse(xml, item_depth=2, item_callback=handler, xml_attribs=True)

打印
('cons',OrderedDict([('id','79550'),('modified_dt','1526652449'),('firstname','Mackenzie'))
,与预期一样。

谢谢!我想这是有道理的,但如果深度为2,我可以像我预期的那样以d[“firstname”]的形式访问firstname字段,但如果深度为1,我是否必须以d[“cons”][“firstname”]?@SteveCohen是的,没错,但它允许访问
id
,例如
d[“cons”[“@id”]
。否,这对我来说仍然没有意义。深度1返回与xml中cons元素对应的深度2元素数组。id在逻辑上与深度2元素相关联。当我在深度1工作时,即使我使用d[“cons']['firstname']语法,我也会得到“列表索引必须是整数,而不是str”“错误。我想我可以在处理程序中遍历列表,但是为什么我必须这样做呢?深度2是我想要的,我仍然不明白为什么属性没有显示出来。我认为这是xmltodict中的一个错误。我认为,从代码看,所有低于指定深度的深度级别都会自动将xml_attribs设置为true(无论是否要求),但在请求的深度,xml_attribs为False。这就是为什么在我的例子中使用深度级别1可以获得属性。在我的例子中,属性属于深度级别2。
xml = """
<api>
<cons id="79550" modified_dt="1526652449">
<firstname>Mackenzie</firstname>
</cons>
</api>
"""

def handler(_,arg):
    for i in arg.items():
        print(i)
    return True

xmltodict.parse(xml, item_depth=2, item_callback=handler, xml_attribs=True)
xmltodict.parse(xml, item_depth=1, item_callback=handler, xml_attribs=True)