当前位置: 首页 > 面试题库 >

如何将名称空间从lxml树中剥离?

柳宏深
2023-03-14
问题内容

从使用python删除XML中的子元素开始…

感谢@Tichodroma,我有以下代码:

如果可以使用lxml,请尝试以下操作:

 import lxml.etree

 tree = lxml.etree.parse("leg.xml")
 for dog in tree.xpath("//Leg1:Dog",
                       namespaces={"Leg1": "http://what.not"}):
     parent = dog.xpath("..")[0]
     parent.remove(dog)
     parent.text = None
 tree.write("leg.out.xml")

现在leg.out.xml看起来像这样:

 <?xml version="1.0"?>
 <Leg1:MOR xmlns:Leg1="http://what.not" oCount="7">
   <Leg1:Order>
     <Leg1:CTemp id="FO">
       <Leg1:Group bNum="001" cCount="4"/>
       <Leg1:Group bNum="002" cCount="4"/>
     </Leg1:CTemp>
     <Leg1:CTemp id="GO">
       <Leg1:Group bNum="001" cCount="4"/>
       <Leg1:Group bNum="002" cCount="4"/>
     </Leg1:CTemp>
   </Leg1:Order>
 </Leg1:MOR>

如何修改代码以Leg1:从所有元素的标记名称中删除名称空间前缀?


问题答案:

从每个元素删除名称空间前缀的一种可能方法:

def strip_ns_prefix(tree):
    #iterate through only element nodes (skip comment node, text node, etc) :
    for element in tree.xpath('descendant-or-self::*'):
        #if element has prefix...
        if element.prefix:
            #replace element name with its local name
            element.tag = etree.QName(element).localname
    return tree

在xpath中有名称空间检查而不是使用ifstatement的另一个版本:

def strip_ns_prefix(tree):
    #xpath query for selecting all element nodes in namespace
    query = "descendant-or-self::*[namespace-uri()!='']"
    #for each element returned by the above xpath query...
    for element in tree.xpath(query):
        #replace element name with its local name
        element.tag = etree.QName(element).localname
    return tree


 类似资料:
  • 问题内容: 我有以下格式的xml文档: 我需要使用lxml中的xpath检索所有元素。我的问题是我不知道如何使用空的名称空间。我尝试了以下示例,但没有用。请指教。 我尝试过的各种方法是: 要么 要么 在这一点上,我只是不知道该尝试什么。任何帮助是极大的赞赏。 问题答案: 这样的事情应该起作用: 另请参见http://lxml.de/xpathxslt.html#namespaces-and- pr

  • 问题内容: 我正在尝试解析OpenOffice ODS电子表格中的内容。ods格式实质上只是一个带有许多文档的zip文件。电子表格的内容存储在“ content.xml”中。 电子表格的内容在一个单元格中: 我们也可以直接进入行: 各个元素都知道名称空间: 如何直接在find / findall中使用命名空间? 明显的解决方案不起作用。 尝试从表中获取行: 问题答案: 如果包含名称空间前缀,则可以

  • 问题内容: 我正在解析由外部程序生成的xml文件。然后,我想使用自己的名称空间将自定义注释添加到此文件。我的输入如下所示: 问题是lxml仅在使用命名空间时才声明它们,这意味着该声明会重复多次,就像这样(简化): 是否可以强制lxml在诸如或的父元素中只编写一次此声明?还是有充分的理由不这样做?我想要的结果是: 一个重要的问题是必须保留从文件中读取的现有数据,因此我不能仅制作一个新的根元素(我想?

  • 我有一个关于ES6导入模块的问题。 我试图在我的Three.js代码中添加OrbitControl。由于OrbitControls是一个单独的模块,我需要在我的代码中分别导入它们,如下所示。它工作得很好。 然而 我首先想到的是 原因是, 据我所知,如果模块将某些内容导出为导出默认值, 我可以通过在“导入”代码中添加花括号来访问它们。 但是,它没有起作用,因此我假设“三个orbitcontrols”

  • 问题内容: 我有一个需要打开并进行一些更改的xml文件,其中之一是删除名称空间和前缀,然后保存到另一个文件。这是xml: 我可以进行所需的其他更改,但是找不到如何删除名称空间和前缀的方法。这是我需要的reusklt xml: 这是我的脚本,它将打开并解析xml并将其保存: 那么,如何在脚本中添加代码以删除名称空间和前缀呢? 问题答案: 按照Uku Loskit的建议替换标签。除此之外,请使用lxm

  • 问题内容: 我有一个XML文档,我正在尝试使用Etree.lxml进行解析 我的代码是: 当我尝试获取dom.getroot()时,我得到: 但是我只想要: 当我做 我什么也得不到。但是,当我 我得到结果。 我认为将ns_clean = True传递给解析器将防止这种情况。 有任何想法吗? 问题答案: 您可以使用以下方法找到可识别名称空间的节点: 如果您确实要删除名称空间,则可以使用XSL转换: