2015-09-28 51 views
2

我想解析一个编码很差的XML并输出标签的节点名称和内容(只有存在的时候),并且只有当string name = content> 30天)。Python ElementTree - 搜索儿童/孙儿写作不好的XML

到目前为止,我可以使用ElementTree搜索子元素,但是我需要帮助解决嵌套不良的信息。我无法更改XML,因为它是供应商提供的报告。我是一个完整的新手,所以请指导我需要做什么或提供更好的帮助。提前致谢。

示例文件:

<?xml version="1.0" encoding="UTF-8"?> 
<ReportSection> 
    <ReportHead> 
     <Criteria> 
      <HeadStuff value=Dont Care> 
      </HeadStuff> 
     </Criteria> 
    </ReportHead> 
    <ReportBody> 
     <ReportSection name="UpTime" category="rule"> 
      <ReportSection name="NodeName.domain.net" category="node"> 
       <String name="node">NodeName.domain.net</String> 
       <String name="typeName">Windows Server</String> 
       <OID>-1y2p0ij32e8c8:-1y2p0idhghwg6</OID> 
       <ReportSection name="UpTime" category="element"> 
        <ReportSection name="2015-09-20 18:50:10.0" category="version"> 
         <String name="version">UpTime</String> 
         <OID>-1y2p0ij32e8cj:-1y2p0ibspofhp</OID> 
         <Integer name="changeType">2</Integer> 
         <String name="changeTypeName">Modified</String> 
         <Timestamp name="changeTime" displayvalue="9/20/15 6:50 PM">1442793010000</Timestamp> 
         <ReportSection name="versionContent" category="versionContent"> 
          <String name="content">12 day(s), 7 hour(s), 33 minute(s), 8 second(s)</String> 
          <String name="content"></String> 
         </ReportSection> 
        </ReportSection> 
       </ReportSection> 
      </ReportSection> 
     </ReportSection> 
    </ReportBody> 
</ReportSection> 
+0

什么是你想要的结果?你有尝试过什么吗?谢谢.. – alecxe

+0

我想返回“节点”值“NodeName.domain.net”,如果值大于30,则返回“12天(s)”的内容。##从xml.etree导入解析器 进口ElementTree的作为等 ##设置xml文件并解析它 根= et.parse( 'C:\\温度\\扫描\\ report.xml将') 用于SEC1在root.iter(): \t Sec1Name = Sec1.attrib.get('name') \t print(Sec1Name) – KFrizz

回答

2

的想法是找到content节点,提取多少天都在那里,然后检查所需的值,并找到节点名。示例(使用lxml.etree):

import re 

from lxml import etree 

pattern = re.compile(r"^(\d+) day\(s\)") 

data = """your XML here""" 
tree = etree.fromstring(data) 

content = tree.findtext(".//String[@name='content']") 
if content: 
    match = pattern.search(content) 
    if match: 
     days = int(match.group(1)) 

     # TODO: check the days if needed 

     node = tree.findtext(".//String[@name='node']") 

     print node, days 

打印:

NodeName.domain.net 12 
+0

如果上面的例子重复几千次,这个工作是否会起作用? node1,node2,node3在xml的深度中发生变化。 – KFrizz

+0

@KFrizz不在这个状态。您基本上需要遍历'ReportSection'节点,并为循环中的每个“ReportSection”创建特定于上下文的代码。你应该在问题中说明它。我认为答案对你来说是一个好的开始,你会改进它以支持多个“ReportSection”节点。 – alecxe