python教程—lxml etree xmlparser删除不需要的名称空间-Python实用宝典

python教程—lxml etree xmlparser删除不需要的名称空间

我有一个xml文档,我试图使用Etree解析它。lxmlMy代码是:当我试图获得dom.getroot()时,我得到:

我有一个xml文档,我试图使用Etree.lxml解析它

    <Envelope xmlns="http://www.example.com/zzz/yyy"> <Header> <Version>1</Version> </Header> <Body> some stuff <Body> <Envelope>

我的代码是:

    path = "path to xml file" from lxml import etree as ET parser = ET.XMLParser(ns_clean=True) dom = ET.parse(path, parser) dom.getroot()

当我尝试获取dom.getroot()时,我得到:

    <Element {http://www.example.com/zzz/yyy}Envelope at 28adacac>

然而,我只想:

    <Element Envelope at 28adacac>

当我做

    dom.getroot().find("Body")

我没有得到任何回报。然而,当我

    dom.getroot().find("{http://www.example.com/zzz/yyy}Body")

我得到一个结果。

我认为将ns_clean=True传递给解析器可以避免这种情况。

什么好主意吗?

回答

    import io import lxml.etree as ET content=''' <Envelope xmlns="http://www.example.com/zzz/yyy"> <Header> <Version>1</Version> </Header> <Body> some stuff </Body> </Envelope> ''' dom = ET.parse(io.BytesIO(content))

您可以使用xpath方法找到支持名称空间的节点:

    body=dom.xpath('//ns:Body',namespaces={'ns':'http://www.example.com/zzz/yyy'}) print(body) # [<Element {http://www.example.com/zzz/yyy}Body at 90b2d4c>]

如果您真的想删除名称空间,您可以使用XSL转换:

    # http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl xslt='''<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="no"/> <xsl:template match="/|comment()|processing-instruction()"> <xsl:copy> <xsl:apply-templates/> </xsl:copy> </xsl:template> <xsl:template match="*"> <xsl:element name="{local-name()}"> <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> </xsl:stylesheet> ''' xslt_doc=ET.parse(io.BytesIO(xslt)) transform=ET.XSLT(xslt_doc) dom=transform(dom)

这里我们看到名称空间被删除了:

    print(ET.tostring(dom)) # <Envelope> # <Header> # <Version>1</Version> # </Header> # <Body> # some stuff # </Body> # </Envelope>

现在你可以这样找到Body节点:

    print(dom.find("Body")) # <Element Body at 8506cd4>

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论