【问题标题】:Ideal xml parser for pythonpython的理想xml解析器
【发布时间】:2015-11-04 00:09:46
【问题描述】:

我一直在尝试使用 lxml 读取 xml 文件并替换类别和子类别标签之间的值。

我想将新的 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>

【问题讨论】:

  • category元素没有属性,所以findall找到category元素,其中没有属性可以找到,所以返回正确。
  • 有没有办法找到类别标签之间的文字?我可能需要迭代才能在多个标签之间查找文本。但是,这是我认为的第二步。
  • 例如,打印 child.text。我建议查看 lxml 文档并阅读有关 XML 结构的信息。

标签: python xml-parsing lxml


【解决方案1】:

这个stackoverflow问题对xml解析有足够的讨论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多