首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解析python中的字符串中的XML

如何解析python中的字符串中的XML
EN

Stack Overflow用户
提问于 2021-10-05 14:55:31
回答 2查看 4.1K关注 0票数 3

我试图从Python中的字符串中解析XML,但没有成功。我试图解析的字符串是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="urn:uuid:573a453c-72c0-4185-8c54-9010593dd102">
   <data>
      <config xmlns="http://www.calix.com/ns/exa/base">
         <profile>
            <policy-map>
               <name>ELINE_PM_1</name>
               <class-map-ethernet>
                  <name>Eth-match-any-1</name>
                  <ingress>
                     <meter-type>meter-mef</meter-type>
                     <eir>1000000</eir>
                  </ingress>
               </class-map-ethernet>
            </policy-map>
            <policy-map>
               <name>ELINE_PM_2</name>
               <class-map-ethernet>
                  <name>Eth-match-any-2</name>
                  <ingress>
                     <meter-type>meter-mef</meter-type>
                     <eir>10000000</eir>
                  </ingress>
               </class-map-ethernet>
            </policy-map>
         </profile>
      </config>
   </data>
</rpc-reply>

我试图使用xml.etree.ElementTree库来解析xml,我还尝试删除与xml和编码相关的第一行,但没有结果。重现我面临的问题的代码片段是:

代码语言:javascript
复制
import xml.etree.ElementTree as ET

reply_xml='''
<data>
   <config>
      <profile>
         <policy-map>
            <name>ELINE_PM_1</name>
            <class-map-ethernet>
               <name>Eth-match-any-1</name>
               <ingress>
                  <meter-type>meter-mef</meter-type>
                  <eir>1000000</eir>
               </ingress>
            </class-map-ethernet>
         </policy-map>
         <policy-map>
            <name>ELINE_PM_2</name>
            <class-map-ethernet>
               <name>Eth-match-any-2</name>
               <ingress>
                  <meter-type>meter-mef</meter-type>
                  <eir>10000000</eir>
               </ingress>
            </class-map-ethernet>
         </policy-map>
      </profile>
   </config>
</data>
'''

root = ET.fromstring(reply_xml)
for child in root:
    print(child.tag, child.attrib)

reply_xml是一个包含上面提到的xml的字符串,所以它应该可以工作,但是如果我使用调试器检查根变量,我会发现它没有被正确地填充。第一个xml (<?xml version="1.0" encoding="UTF-8"?>)似乎产生了一些问题,但即使我手动删除它,也无法正确地解析该xml。

有什么线索可以解析那个xml吗?

EN

回答 2

Stack Overflow用户

发布于 2021-10-05 15:03:23

你的代码很好用。它显示根元素的所有子元素,该元素仅为<config> .. </config>,没有属性。

要获得<eir>标记,您应该使用XPath,或者递归地遍历树。

XPath的快速解决方案:

代码语言:javascript
复制
root.findall('.//eir')
票数 2
EN

Stack Overflow用户

发布于 2021-10-05 15:06:45

见下文(1条带有xpath的班轮)

代码语言:javascript
复制
import xml.etree.ElementTree as ET

reply_xml='''
<data>
   <config>
      <profile>
         <policy-map>
            <name>ELINE_PM_1</name>
            <class-map-ethernet>
               <name>Eth-match-any-1</name>
               <ingress>
                  <meter-type>meter-mef</meter-type>
                  <eir>1000000</eir>
               </ingress>
            </class-map-ethernet>
         </policy-map>
         <policy-map>
            <name>ELINE_PM_2</name>
            <class-map-ethernet>
               <name>Eth-match-any-2</name>
               <ingress>
                  <meter-type>meter-mef</meter-type>
                  <eir>20000000</eir>
               </ingress>
            </class-map-ethernet>
         </policy-map>
      </profile>
   </config>
</data>
'''

root = ET.fromstring(reply_xml)
eirs = [e.text for e in root.findall('.//eir')]
print(eirs)

输出

代码语言:javascript
复制
['1000000', '20000000']
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69452755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档