簡體   English   中英

使用 Python 解析 XML 文件

[英]XML file parsing with Python

我無法以這種方式為轉換為 CSV 的 XML 文件解析數據: 在此處輸入圖片說明

對於第一列,我想獲取通用名稱標簽(recordingSystem、Ports 等)並將其與行標簽中的 subNames(closedFileCount、processedFileCount 等)連接起來

subName 所在的標簽不斷變化,可能是“usage”、“lwGuage”、“hwGauge”等。 我還需要收集這些並將其放在旁邊的列中。

請參閱下面的示例 XML:

<?xml version="1.0" encoding="UTF-8"?>

<omGroups xmlns="urn:nortel:namespaces:mcp:oms" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:nortel:namespaces:mcp:oms OMSchema.xsd" >

        <group>
                <name>RecordingSystem</name>
                <row>
                        <package>com.nortelnetworks.mcp.ne.base.recsystem.fw.system</package>
                        <class>RecSysFileOMRow</class>
                        <usage name="closedFileCount" hasThresholds="true">
                                <measures>
                                        closed file count
                                </measures>
                                <description>
                                        This register counts the number
                                        of closed files in the spool directory of a
                                        particular stream and a particular system.
                                        Files in the spool directory store the raw
                                        OAM records where they are sent to the
                                        Element Manager for formatting.
                                </description>
                                <notes>
                                        Minor and major alarms
                                        when the value of closedFileCount
                                        exceeds certain thresholds. Configure
                                        the threshold values for minor and major
                                        alarms for this OM through engineering
                                        parameters for minorBackLogCount and
                                        majorBackLogCount, respectively. These
                                        engineering parameters are grouped under
                                        the parameter group of Log, OM, and
                                        Accounting for the logs’ corresponding
                                        system.
                                </notes>
                        </usage>
                        <usage name="processedFileCount" hasThresholds="true">
                                <measures>
                                        Processed file count
                                </measures>
                                <description>
                                        The register counts the number
                                        of processed files in the spool directory of
                                        a particular stream and a particular system.
                                        Files in the spool directory store the raw
                                        OAM records and then send the records to
                                        the Element Manager for formatting.
                                </description>
                        </usage>
                </row>
                <documentation>
                        <description>
                                Rows of this OM group provide a count of the number of files contained
                                within the directory (which is the OM row key value).
                        </description>
                        <rowKey>
                                The full name of the directory containing the files counted by this row.
                        </rowKey>
                </documentation>
                <generatedOn>
                        <all/>
                </generatedOn>
        </group>
        <group traffic="true">
                <name>Ports</name>
                <row>
                        <package>com.nortelnetworks.ims.cap.mediaportal.host</package>
                        <class>PortsOMRow</class>
                        <usage name="rtpMpPortUsage">
                                <measures>
                                        BCP port usage
                                </measures>
                                <description>
                                        Meter showing number of ports in use.
                                </description>
                        </usage>
                        <lwGauge name="connMapEntriesLWM">
                                <measures>
                                        Lowest simultaneous port usage
                                </measures>
                                <description>
                                        Lowest number of
                                        simultaneous ports detected to be in
                                        use during the collection interval
                                </description>
                        </lwGauge>
                        <hwGauge name="connMapEntriesHWM">
                                <measures>
                                        Highest simultaneous port usage
                                </measures>
                                <description>
                                        Highest number of
                                        simultaneous ports detected to be in
                                        use during the collection interval.
                                </description>
                        </hwGauge>
                        <waterMark name="connMapEntries">
                                <measures>
                                        Connections map entries
                                </measures>
                                <description>
                                        Meter showing the number of connections in the host
                                        CPU connection map.
                                </description>
                                <bwg lwref="connMapEntriesLWM" hwref="connMapEntriesHWM"/>
                        </waterMark>
                        <counter name="portUsageSampleCnt">
                                <measures>
                                    Usage sample count
                                </measures>
                                <description>
                                    The number of 100-second samples taken during the
                                    collection interval contributing to the average report.
                                </description>
                        </counter>
                        <counter name="sampledRtpMpPortUsage">
                                <measures>
                                    In-use ports usage
                                </measures>
                                <description>
                                    Provides the sum of the in-use ports every 100 seconds.
                                </description>
                        </counter>
                        <precollector>
                                <package>com.nortelnetworks.ims.cap.mediaportal.host</package>
                                <class>PortsOMCenturyPrecollector</class>
                                <collector>centurySecond</collector>
                        </precollector>
                </row>
                <documentation>
                        <description>
                        </description>
                        <rowKey>
                        </rowKey>
                </documentation>
                <generatedOn>
                        <list>
                            <ne>sessmgr</ne>
                            <ne>rtpportal</ne>
                        </list>
                </generatedOn>
        </group>
       
</omGroups>

下面的代碼應該獲取 GeneralName 並將其顯示在 csv 文件中正確的次數,但我無法讓它顯示任何內容。

from xml.etree import ElementTree
import csv
from copy import copy

import lxml.etree



tree = ElementTree.parse('OM.xml')

sitescope_data = open('OMFileConverted.csv', 'w', newline='', encoding='utf-8')
csvwriter = csv.writer(sitescope_data)



#Create all needed columns here in order and writes them to excel file
col_names = ['name', 'OMRegister']
csvwriter.writerow(col_names)

def recurse(root, props):
    for child in root:
        if child.tag == '{urn:nortel:namespaces:mcp:oms}group':
            p2 = copy(props)
            for event in root.findall('{urn:nortel:namespaces:mcp:oms}group'):
                event_id = event.find('{urn:nortel:namespaces:mcp:oms}name')
                if event_id != None:
                    p2['name'] = event_id.text
                    recurse(child, p2)
                else:
                    recurse(child, props)


    for event in root.findall('{urn:nortel:namespaces:mcp:oms}group'):

        event_data = [props.get('name')]



        csvwriter.writerow(event_data)



root = tree.getroot()
recurse(root,{}) #root + empty dictionary
sitescope_data.close()

如果xml_string是問題中的 XML 片段,則此腳本:

import csv
from bs4 import BeautifulSoup

soup = BeautifulSoup(xml_string, 'html.parser')

with open('data.csv', 'w', newline='') as f_out:
    writer = csv.writer(f_out)
    writer.writerow(['General name:SpecificName', 'RegisterType'])
    for item in soup.select('row [name]'):
        writer.writerow([item.find_previous('name').text + ':' + item['name'], item.name])

生成data.csv (來自 LibreOffice 的截圖):

在此處輸入圖片說明


編輯:要將measures標記放入列中,您可以執行以下操作:

import csv
from bs4 import BeautifulSoup

soup = BeautifulSoup(xml_string, 'html.parser')

with open('data.csv', 'w', newline='') as f_out:
    writer = csv.writer(f_out)
    writer.writerow(['General name:SpecificName', 'RegisterType', 'Measures'])
    for item in soup.select('row [name]'):
        writer.writerow([item.find_previous('name').text + ':' + item['name'], item.name, item.find('measures').get_text(strip=True)])

產生:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM