2015-01-07 3 views
1

У меня есть этот XML-файл:разбор вложенной XML в Python

<?xml version="1.0" ?><XMLSchemaPalletLoadTechData xmlns="http://tempuri.org/XMLSchemaPalletLoadTechData.xsd"> 
    <TechDataParams> 
    <RunNumber>sample</RunNumber> 
    <Holder>sample</Holder> 
    <ProcessToolName>sample</ProcessToolName> 
    <RecipeName>sample</RecipeName> 
    <PalletName>sample</PalletName> 
    <PalletPosition>sample</PalletPosition> 
    <IsControl>sample</IsControl> 
    <LoadPosition>sample</LoadPosition> 
    <HolderJob>sample</HolderJob> 
    <IsSPC>sample</IsSPC> 
    <MeasurementType>sample</MeasurementType> 
    </TechDataParams> 
    <TechDataParams> 
    <RunNumber>sample</RunNumber> 
    <Holder>sample</Holder> 
    <ProcessToolName>sample</ProcessToolName> 
    <RecipeName>sample</RecipeName> 
    <PalletName>sample</PalletName> 
    <PalletPosition>sample</PalletPosition> 
    <IsControl>sample</IsControl> 
    <LoadPosition>sample</LoadPosition> 
    <HolderJob>sample</HolderJob> 
    <IsSPC>sample</IsSPC> 
    <MeasurementType>XRF</MeasurementType> 
    </TechDataParams> 
</XMLSchemaPalletLoadTechData> 

И это мой код для разбора XML:

for data in xml.getElementsByTagName('TechDataParams'): 
    #parse xml 
    runnum=data.getElementsByTagName('RunNumber')[0].firstChild.nodeValue 
    hold=data.getElementsByTagName('Holder')[0].firstChild.nodeValue 
    processtn=data.getElementsByTagName('ProcessToolName'[0].firstChild.nodeValue) 
    recipedata=data.getElementsByTagName('RecipeName'[0].firstChild.nodeValue) 
    palletna=data.getElementsByTagName('PalletName')[0].firstChild.nodeValue 
    palletposi=data.getElementsByTagName('PalletPosition')[0].firstChild.nodeValue 
    control = data.getElementsByTagName('IsControl')[0].firstChild.nodeValue 
    loadpos=data.getElementsByTagName('LoadPosition')[0].firstChild.nodeValue 
    holderjob=data.getElementsByTagName('HolderJob')[0].firstChild.nodeValue 
    spc = data.getElementsByTagName('IsSPC')[0].firstChild.nodeValue 
    mestype = data.getElementsByTagName('MeasurementType')[0].firstChild.nodeValue 

но когда я печать каждого узла, я только получаю один набор «TechDataParams», но я хочу, чтобы получить все «TechDataParams» из XML.

Дайте мне знать, если мой вопрос немного неясен.

ответ

1

Пожалуйста, не погружайтесь в разборе XML с minidom, если вы не хотите, чтобы ваши волосы вытащить самостоятельно.

Я бы использовал xmltodict module здесь. Одна линия, и у вас есть список dicts со всеми данными, вам необходимо:

import xmltodict 

data = """your xml here""" 

data = xmltodict.parse(data)['XMLSchemaPalletLoadTechData']['TechDataParams'] 
for params in data: 
    print dict(params) 

Печать:

{u'PalletPosition': u'sample', u'HolderJob': u'sample', u'RunNumber': u'sample', u'ProcessToolName': u'sample', u'RecipeName': u'sample', u'IsControl': u'sample', u'PalletName': u'sample', u'LoadPosition': u'sample', u'MeasurementType': u'sample', u'Holder': u'sample', u'IsSPC': u'sample'} 
{u'PalletPosition': u'sample', u'HolderJob': u'sample', u'RunNumber': u'sample', u'ProcessToolName': u'sample', u'RecipeName': u'sample', u'IsControl': u'sample', u'PalletName': u'sample', u'LoadPosition': u'sample', u'MeasurementType': u'XRF', u'Holder': u'sample', u'IsSPC': u'sample'} 
+0

спасибо! я попробую ваше предложение! – ellabells

0

Вот вам пример. Замените file_path своим.

Я заменяю значение RunNumber на 001 и 002.

# -*- coding: utf-8 -*- 
#!/usr/bin/python 

from xml.dom import minidom 

file_path = 'C:\\temp\\test.xml' 

doc = minidom.parse(file_path) 
TechDataParams = doc.getElementsByTagName('TechDataParams') 
for t in TechDataParams: 
    num = t.getElementsByTagName('RunNumber')[0] 
    print 'num is ', num.firstChild.data 

ВЫВОД:

num is 001 
num is 002 
+0

спасибо! Я также попробую этот метод и посмотрю, что работает лучше всего! – ellabells

0

Также на lxml.etree модуль.

  1. ввода содержит пространство имен т.е. http://tempuri.org/XMLSchemaPalletLoadTechData.xsd
  2. Используйте xpath метод, чтобы найти целевой TechDataParams меток.
  3. Получить детей из TechDataParams тег и создать словарь, который key is tag name и value is text of tag.
  4. Добавить в список varaible, который является TechDataParams.

код:

from lxml import etree 
root = etree.fromstring(content) 
TechDataParams_info = [] 
for i in root.xpath("//a:XMLSchemaPalletLoadTechData/a:TechDataParams", namespaces={"a": 'http://tempuri.org/XMLSchemaPalletLoadTechData.xsd'}): 
    temp = dict() 
    for j in i.getchildren(): 
     temp[j.tag.split("}", 1)[-1]] = j.text 
    TechDataParams_info.append(temp) 

print TechDataParams_info 

выход:

[{'PalletPosition': 'sample', 'HolderJob': 'sample', 'RunNumber': 'sample', 'ProcessToolName': 'sample', 'RecipeName': 'sample', 'IsControl': 'sample', 'PalletName': 'sample', 'LoadPosition': 'sample', 'MeasurementType': 'sample', 'Holder': 'sample', 'IsSPC': 'sample'}, {'PalletPosition': 'sample', 'HolderJob': 'sample', 'RunNumber': 'sample', 'ProcessToolName': 'sample', 'RecipeName': 'sample', 'IsControl': 'sample', 'PalletName': 'sample', 'LoadPosition': 'sample', 'MeasurementType': 'XRF', 'Holder': 'sample', 'IsSPC': 'sample'}] 
+0

спасибо! Я также попробую этот метод и посмотрю, что работает лучше всего! – ellabells

Смежные вопросы