2016-07-22 2 views
0

У меня есть происходит некорректно XML,Синтаксический сложный XML в Python LXML парсер

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Suite> 
<TestCase> 
    <TestCaseID>001</TestCaseID> 
    <TestCaseDescription>Hello</TestCaseDescription> 
    <TestSetup> 
    <Action> 
     <ActionCommand>gfdg</ActionCommand> 
     <TimeOut>dfgd</TimeOut> 
     <BamSymbol>gff</BamSymbol> 
     <Side>vfbgc</Side> 
     <PrimeBroker>fgfd</PrimeBroker> 
     <Size>fbcgc</Size> 
     <PMCode>fdgd</PMCode> 
     <Strategy>fdgf</Strategy> 
     <SubStrategy>fgf</SubStrategy> 
     <ActionLogEndPoint>fdgf</ActionLogEndPoint> 
     <IsActionResultLogged>fdgf</IsActionResultLogged> 
     <ValidationStep> 
     <IsValidated>fgdf</IsValidated> 
     <ValidationFormat>dfgf</ValidationFormat> 
     <ResponseEndpoint>gdf</ResponseEndpoint> 
     <ResponseParameterName>fdgfdg</ResponseParameterName> 
     <ResponseParameterValue>gff</ResponseParameterValue> 
     <ExpectedValue>fdgf</ExpectedValue> 
     <IsValidationResultLogged>gdfgf</IsValidationResultLogged> 
     <ValidationLogEndpoint>fdgf</ValidationLogEndpoint> 
     </ValidationStep> 
    </Action> 
    </TestCase> 
</Suite> 

вопрос, я не мог получить subparent тег (validationStep) и все его дочерние значения. может кто-нибудь помочь.

Мой код:

import xml.etree.ElementTree as ET 
import collections 
t2 =[] 
v2 =[] 
test_case = collections.OrderedDict() 
tree = ET.parse('Action123.xml') 
root = tree.getroot() 

for testSetup4 in root.findall(".TestCase/TestSetup/Action"): 
    if testSetup4.find('ActionCommand').text == "gfdg": 
     for c1 in testSetup4: 
      t2.append(c1.tag) 
      v2.append(c1.text) 

     for k,v in zip(t2, v2): 
      test_case[k] = v 

Пожалуйста, помогите мне в этом вопросе, я новичок в LXML анализатор.

+0

Ваш xml недействителен. Отсутствует закрытие ''. –

+0

Простите за это! Ошибка копирования патча – user2829222

ответ

1

Вы не используете lxml, вы используете xml.etree.ElementTree из стандартной библиотеки Python.

Если бы вы были на самом деле использовать lxml, предполагая, что он установлен, изменить свой импорт в:

import lxml.etree as ET 

Затем, вы можете проверить значение ActionCommand прямо внутри выражения XPath:

for testSetup4 in root.xpath(".//TestCase/TestSetup/Action[ActionCommand = 'gfdg']"): 
    for c1 in testSetup4: 
     t2.append(c1.tag) 
     v2.append(c1.text) 

    for k, v in zip(t2, v2): 
     test_case[k] = v 
+0

Спасибо. Попробуем :) – user2829222

0

Если я вас правильно понимаю, вам необходимо что-то вроде этого:

for testSetup4 in root.findall(".TestCase/TestSetup/Action"): 
    if testSetup4.find('ActionCommand').text == "gfdg": 
     for c1 in testSetup4:  
      if c1.tag != "ValidationStep": 
       t2.append(c1.tag) 
       v2.append(c1.text) 
      else: 
       for ch in c1: 
        t2.append(ch.tag) 
        v2.append(ch.text) 
+0

Спасибо! Будет проверять это :) – user2829222

0

Это сделано. Вот мой код:

for testSetup4 in root.findall(".TestCase/TestSetup/Action"): 
    if testSetup4.find('ActionCommand').text == "gfdg": 
     for c1 in testSetup4: 
      t1.append(c1.tag) 
      v1.append(c1.text) 

     for k,v in zip(t1, v1): 
      test_case[k] = v 

     valid = testSetup4.find('ValidationStep') 
     for c2 in valid: 
      t2.append(c2.tag) 
      v2.append(c2.text) 

     for k,v in zip(t2, v2): 
      test_case[k] = v 
Смежные вопросы