如何告诉lxml.etree.tostring(元素)不要用python编写名称空间?

如何告诉lxml.etree.tostring(元素)不要用python编写名称空间?,python,namespaces,lxml,tostring,elementtree,Python,Namespaces,Lxml,Tostring,Elementtree,我有一个巨大的xml文件(1G)。我想将一些元素(entry)移动到具有相同头和规范的另一个文件中 假设原始文件包含带有标签的条目: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE some SYSTEM "some.dtd"> <some> ... <to_move date="somedate"> <child>some text</child>

我有一个巨大的xml文件(1G)。我想将一些元素(entry)移动到具有相同头和规范的另一个文件中

假设原始文件包含带有标签的条目:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE some SYSTEM "some.dtd">
<some>
...
<to_move date="somedate">
    <child>some text</child>
    ...
...
</to_move>
...
</some>
但这导致了

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE some SYSTEM "some.dtd">
<some>
...
<to_move xmlns:="some" date="somedate">  # <---- Here is the problem. I don't want the namespace.
    <child>some text</child>
    ...
...
</to_move>
...
</some>
将元素序列化为其XML的编码字符串表示形式 树

对我来说,
tostring()
的每个参数似乎都没有帮助。有什么建议或更正吗?

有一种方法可以:

导入io
将lxml.etree作为ET导入
def删除_名称空间(文档):
# http://wiki.tei-c.org/index.php/Remove-Namespaces.xsl
xslt=''
'''
xslt_doc=ET.parse(io.BytesIO(xslt))
transform=ET.XSLT(XSLT\u doc)
doc=转换(doc)
退货单
doc=ET.parse('data.xml')
doc=删除名称空间(doc)
打印(ET.tostring(文档))
屈服

<some>

<to_move date="somedate">
    <child>some text</child>
</to_move>

</some>

一些文本

我经常抓取一个名称空间为它创建一个别名,如下所示:

someXML = lxml.etree.XML(someString)
if ns is None:
      ns = {"m": someXML.tag.split("}")[0][1:]}
someid = someXML.xpath('.//m:ImportantThing//m:ID', namespaces=ns)
您可以执行类似于抓取名称空间的操作,以便生成一个正则表达式,在使用
tostring
后将其清除


或者您可以清理输入字符串。找到第一个空格,检查后面是否有xmlns,如果是,则删除整个xmlns位直到下一个空格,如果否,则删除该空格。重复此操作,直到不再有空格或xmlns声明。但是不要越过第一个

,这更多的是对“unutbu”的回答的评论,在这个回答中,需要一个清理名称空间的建议,但没有给出示例。这可能就是你要找的

from lxml import objectify
objectify.deannotate(root, cleanup_namespaces=True)

我理解名称空间背后的伟大理念。:-)但在我的这个特例中,根本没有利润。这并不意味着我将永远忽略它们。:-)谢谢这不会删除任何名称空间。在文档中:“通过删除'py:pytype'和/或'xsi:type'属性和/或'xsi:nil'属性,递归地取消对XML树元素的注释。”这几乎对我起了作用,我在结果字符串中仍然有一个
xmlns
属性,有没有办法不用regexp就摆脱它?这很有效。此外,使用
objectify
和参数
annotate=False
生成元素也可以:例如:
myE=objectify.ElementMaker(annotate=False)
然后
x=myE.rootElem()
;您可以使用
etree.tostring(x,method='xml')
对其进行序列化,然后返回
<some>

<to_move date="somedate">
    <child>some text</child>
</to_move>

</some>
someXML = lxml.etree.XML(someString)
if ns is None:
      ns = {"m": someXML.tag.split("}")[0][1:]}
someid = someXML.xpath('.//m:ImportantThing//m:ID', namespaces=ns)
from lxml import objectify
objectify.deannotate(root, cleanup_namespaces=True)