2015-08-11 2 views
0

Я пытаюсь использовать lxml для чтения XML-файла и замены значений между тегами категории и подкатегорий.Идеальный XML-парсер для python

Я хочу перенаправить новый xml в новый файл.

data = """<xml> 
<questionset author="Joee Foo" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://www.escreeningz.com" 
xsi:schemaLocation="http://www.escreeningz.com ../xsd/QuestionSet.xsd"> 
<question status="A" identifier="SampleQuestions.xml_1"> 
    <classification> 
     <type>CONCEPTUAL</type> 
     <category>Core Java</category> 
     <subcategory>Exception Handling</subcategory> 
     <difficulty>2</difficulty> 
    </classification> 
    <tags> 
     <tag>Exception Hierarchy</tag> 
     <tag>Checked and Unchecked exceptions</tag> 
     <tag>Finally Block</tag> 
    </tags> 
    <preface> 
     <section order="1" type="STANDARD"> 
      <value><![CDATA[Which of the statements regarding exceptions in Java are true?]]></value> 
     </section> 
    </preface> 
    <answers> 
     <answer correct="false" score="-4"> 
      <value><![CDATA[Checked exceptions extend java.lang.RuntimeException. 
      ]]></value> 
      <explain>It is uncheked exception that extend java.lang.Runtime;not checked</explain> 
     </answer> 
     <answer correct="true" score="5"> 
      <value><![CDATA[The base class for all Exceptions and Errors is java.lang.Throwable. 
      ]]></value> 
     </answer> 
     <answer correct="true" score="5"> 
      <value><![CDATA[Any method that might throw a checked exception like java.io.IOException must either declare 
    the exception using the throws keyword or handle the exception with an appropriate try/catch. 
    ]]></value> 
     </answer> 
     <answer correct="true" score="2"> 
      <value><![CDATA[If you use a finally block, it will always be invoked regardless of whether an exception in the corresponding try is thrown or not 
    and regardless of whether a thrown exception is caught or not as long as the JVM is running. 
    ]]></value> 
     </answer> 
     <answer correct="false" score="-4"> 
      <value><![CDATA[All catch blocks must be ordered as general caught first to specific caught last]]></value> 
      <explain>All catch blocks must be ordered from specific to general</explain> 
     </answer> 
    </answers> 
</question> 
</questionset> 
</xml> 
""" 

# csv to xml conversion 

import sys 
import os 
import csv 
import xml.etree.ElementTree as ET 
from lxml import etree 
from StringIO import StringIO 
from lxml.etree import Element 
stream = StringIO(data) 
context = etree.iterparse(stream, events=("start",)) 

Теперь, когда я пытаюсь извлечь значение между и тегами, он возвращает пустой список. :(

for action,elem in context: 
    for child in elem.findall('{http://www.escreeningz.com}category'): 
     print child.attrib 

Result is : {} 

Когда я запускаю код, приведенный ниже, он возвращает тег правильно:

for action,elem in context: 
    for child in elem.findall('{http://www.escreeningz.com}category'): 
     print child.tag 

Result: {http://www.escreeningz.com}category 

Я пропускаю что-то здесь

я, наконец, нужно заменить

<category>Core Java</category> 
.

с

<category>SQL</category> 
+2

Элемент категории не имеют атрибутов, поэтому FindAll находит элементы категории, и нет никаких признаков, чтобы найти среди них, поэтому он возвращается правильно. –

+0

Есть ли способ найти текст между тегами категории? Возможно, мне придется перебирать текст между несколькими тегами. Но, это второй шаг, который я думаю. – Tammy

+2

для вашего примера, принт child.text. Я предлагаю проверить документацию lxml и прочитать о структуре XML. –

ответ

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