【问题标题】:python sax xml names of the children tags子标签的python sax xml名称
【发布时间】:2012-03-17 04:06:05
【问题描述】:

我正在尝试使用 python 的 sax 库获取子标签的名称。我使用 ContentHandler 作为处理程序。有人知道如何获取标签名称吗?

假设我们的 xml 文档如下所示:

<root>
    <parent>
        <child1>X</child1>
        <child2>Y</child2>
    </parent>
</root>

假设我们使用处理程序的模板:

class parserSAXHandler(handler.ContentHandler):

    def __init__(self):
                pass;
    def startElement(self, name, attrs):
                pass;
    def endElement(self,name):
                pass;
    def characters(self, content):
                pass;

假设我只知道父母的名字,我如何获得字符串“child1”和“child2”?

【问题讨论】:

    标签: python xml xml-parsing sax


    【解决方案1】:

    SAX 风格的解析器要求您跟踪您需要的所有状态,例如您看到了哪些标签。至少,您需要编写一个startElement() 处理程序,它在看到&lt;parent&gt; 标记时设置一个标志,以及一个endElement() 在它看到结束标记时清除该标志。 startElement() 处理程序还需要累积设置此标志时在列表中看到的标签。

    class parserSAXHandler(handler.ContentHandler):
    
        def __init__(self):
            self.parentflag = False
            self.childlist  = []
    
        def startElement(self, name, attrs):
            if name == "parent":
               self.parentflag = True
            elif self.parentflag:
               self.childlist.append(name)
    
        def endElement(self,name):
            if name == "parent":
                self.parentflag = False
    

    解析后实例的childlist属性会有你想要的列表。

    如果有可能在&lt;child&gt; 标签中嵌套额外的标签并且您想要这些标签名称,您可能需要更复杂的逻辑。事实上,任何嵌套在&lt;parent&gt; 容器内的任何标签都包括在内。跟踪嵌套的最简单方法可能是使用堆栈:推入每个开始标签,弹出每个结束标签,然后您可以检查parent 是否位于堆栈顶部。

    class parserSAXHandler(handler.ContentHandler):
    
        def __init__(self):
            self.tagstack   = []
            self.childlist  = []
    
        def startElement(self, name, attrs):
            if self.tagstack[-1] == "parent":
               self.childlist.append(name)
            self.tagstack.append(name)
    
        def endElement(self,name):
            if name == self.tagstack[-1]:
                self.tagstack.pop()
            else:
                raise SAXParseException("tag closed without being open")
    

    DOM 样式的解析器,例如xml.dom.minidomlxml,更容易处理这些类型的任务,因为它会为您跟踪元素之间的关系。这样的解析器可能是满足您需求的更好选择:

    from xml.dom.minidom import parseString
    
    xml = """
        <root>
            <parent>
                <child1>X</child1>
                <child2>Y</child2>
            </parent>
        </root>
    """
    
    dom = parseString(xml)
    children = [c.localName for p in dom.getElementsByTagName("parent")
                for c in p.childNodes if c.nodeType == c.ELEMENT_NODE]
    

    您会注意到,一旦minidom 模块解析了我们的 XML,您的查询就是一个单个 Python 语句(当然,它包含两个循环,但它仍然是一个语句)。使用 SAX 样式的解析器无法真正达到那种简洁程度。

    现在,SAX 风格的解析器比 DOM 解析器更快,使用更少的内存,这在十年前很重要,但在现代处理器上差距要小得多,尤其是在小型文档上。程序员的时间更宝贵。

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 2012-11-16
      • 2019-04-30
      相关资源
      最近更新 更多