Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用名称空间和Python(lxml)从XML获取XML属性_Python_Xml_Rest_Python Requests_Lxml - Fatal编程技术网

使用名称空间和Python(lxml)从XML获取XML属性

使用名称空间和Python(lxml)从XML获取XML属性,python,xml,rest,python-requests,lxml,Python,Xml,Rest,Python Requests,Lxml,我试图从下面的XML中获取“id”和“href”属性。到目前为止,我似乎还不能理解名称空间方面。我可以很容易地使用没有名称空间引用的XML。但这让我感到困惑。任何想法都将不胜感激 <?xml version="1.0" encoding="utf-8" standalone="yes"?> <ns3:searchResult total="1" xmlns:ns5="ers.ise.cisco.com" xmlns:ers-v2="ers- v2" xmlns:xs="h

我试图从下面的XML中获取“id”和“href”属性。到目前为止,我似乎还不能理解名称空间方面。我可以很容易地使用没有名称空间引用的XML。但这让我感到困惑。任何想法都将不胜感激

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns3:searchResult total="1" xmlns:ns5="ers.ise.cisco.com" xmlns:ers-v2="ers-    v2" xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:ns3="v2.ers.ise.cisco.com">
    <ns3:resources>
            <ns5:resource id="d28b5080-587a-11e8-b043-d8b1906198a4"name="00:1B:4F:32:27:50">
        <link rel="self" href="https://ho-lab-ise1:9060/ers/config/endpoint/d28b5080-587a-11e8-b043-d8b1906198a4"type="application/xml"/>
    </ns5:resource>
</ns3:resources>


您可以使用
xpath
函数搜索所有资源并对其进行迭代。该函数具有名称空间关键字参数。可以使用它来声明命名空间前缀和命名空间URL之间的映射

以下是想法:

from lxml import etree

NS = {
    "ns5": "ers.ise.cisco.com",
    "ns3": "v2.ers.ise.cisco.com"
}

tree = etree.parse('your.xml')

resources = tree.xpath('//ns5:resource', namespaces=NS)

for resource in resources:
    print(resource.attrib['id'])
    links = resource.xpath('link')
    for link in links:
        print(link.attrib['href'])
对不起,这不是测试


这是你的电话号码

@laurent laporte的答案非常适合展示如何处理多个名称空间(+1)

但是,如果您确实只需要选择两个属性,而不管它们在哪个命名空间中,您可以在谓词中测试
local-name()

从lxml导入etree
tree=etree.parse('your.xml')
attrs=tree.xpath(“/@*[local-name()='id'或local-name()='href']”)
对于属性中的属性:
打印(属性)
这将打印(与Laurent的相同)

d28b5080-587a-11e8-b043-d8b1906198a4
https://ho-lab-ise1:9060/ers/config/endpoint/d28b5080-587a-11e8-b043-d8b1906198a4

谢谢,这非常有效。现在,让我进一步学习XML,以确保我理解名称空间的概念。现在对我来说没什么意义。谢谢