嵌套JSON字典和列表

时间:2019-01-14 17:31:53

标签: python json nested

这是当前的json文件输出:

{
    "filename.xml": 
    [
         {"TotalIssues": "352"}, 
         {"TotalVariants": "727"},
         {"TotalRemediations": "352"}, 
         {"TotalScanDuration": "1.03:31:39.2198925"}
    ],
    "http://www.web.com/":
    [
         {"TotalInformationalIssues": "352"}, 
         {"TotalInformationalIssues": "727"}
    ]
}

我正在尝试将嵌套在文件名filename.xml(是根目录)下面的'http://www.web.com/'引入。 这是所需的输出:

{"filename.xml":
 {"TotalIssues": "352",
"TotalVariants": "727",
"TotalRemediations": "352",
"TotalScanDuration": "1.03:31:39.2198925",
        "http://www.web.com/":
        [
           {"TotalInformationalIssues": "352"},
           {"TotalLowSeverityIssues": "727"}]

        }}

这是要解析的源xml:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<XmlReport Name="x:\\projects\\www.web.com\\scan-2019-08-01-29762.scan" XmlExportVersion="2.0">
<ScanInfo>
  <Version>9.0.3.4</Version>
  <ServicePack />
</ScanInfo>
<Summary>
  <TotalIssues>352</TotalIssues>
  <TotalVariants>727</TotalVariants>
  <TotalRemediations>352</TotalRemediations>
  <TotalScanDuration>1.03:31:39.2198925</TotalScanDuration>
  <Hosts>
    <Host Name="http://www.web.com/">
      <TotalInformationalIssues>16</TotalInformationalIssues>
      <TotalLowSeverityIssues>1</TotalLowSeverityIssues>
      <TotalMediumSeverityIssues>0</TotalMediumSeverityIssues>
      <TotalHighSeverityIssues>0</TotalHighSeverityIssues>
      <Total>17</Total>
    </Host>
    <Host Name="https://www.web2.com/">
      <TotalInformationalIssues>332</TotalInformationalIssues>
      <TotalLowSeverityIssues>3</TotalLowSeverityIssues>
      <TotalMediumSeverityIssues>0</TotalMediumSeverityIssues>
      <TotalHighSeverityIssues>0</TotalHighSeverityIssues>
      <Total>335</Total>
    </Host>
  </Hosts>
</Summary>
</XmlReport>

这是我的代码:

import os
import logging
import sys
import json

logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', filename='/tmp/reports/myapp.log', level=logging.INFO)
data = {}


## stream read xml file

import xml.etree.ElementTree as ET
for filename in os.listdir("/tmp/reports"):
    try:
        if filename.endswith(".xml"):
            print("Handeling :"+os.path.join("/tmp/reports", filename))
            tree = ET.parse(os.path.join("/tmp/reports", filename))
            root = tree.getroot()

            data[filename] = []


            for item in root.findall('Summary'):
                TotalIssues = item.find('TotalIssues').text
                TotalVariants = item.find('TotalVariants').text
                TotalRemediations = item.find('TotalRemediations').text
                TotalScanDuration = item.find('TotalScanDuration').text

                data[filename].append({'TotalIssues':item.find('TotalIssues').text})
                data[filename].append({'TotalVariants':item.find('TotalVariants').text})
                data[filename].append({'TotalRemediations':item.find('TotalRemediations').text})
                data[filename].append({'TotalScanDuration':item.find('TotalScanDuration').text})


            data['http://www.web.com/'] = []

            for host in root.iter('Host'):

                TotalInformationalIssues = host.find('TotalInformationalIssues').text
                TotalLowSeverityIssues = host.find('TotalLowSeverityIssues').text



                data['http://www.web.com/'].append(host.attrib) ## http://www.web.com/
                data['http://www.web.com/'].append({'TotalInformationalIssues':host.find('TotalInformationalIssues').text})
                data['http://www.web.com/'].append({'TotalLowSeverityIssues':host.find('TotalLowSeverityIssues').text})


            print("Finished handeling "+filename)
            logging.info("Finished handeling "+filename)
            jsonfile = os.path.splitext(filename)[0]+'.json'
            print(jsonfile)
            with open('/tmp/reports/'+jsonfile, 'w') as outfile:
                json.dump(data, outfile)

        else:
            print("no file exist")
            logging.info("no file to process")
        #TotalIssues = item.find('TotalIssues').text
    except:
        print("Unexpected error:", sys.exc_info()[0])
        logging.error("Unexpected error:", sys.exc_info()[0])
        raise

我不确定我是否应该使用嵌套的“ for”。如果我那么去哪里? 我想不出一种结合json对象和嵌套数组的方法 感谢您的帮助! 谢谢!

0 个答案:

没有答案
相关问题