如何告诉lxml.etree.tostring(元素)不要用python编写名称空间?
我有一个巨大的xml文件(1G)。我想将一些元素(entry)移动到具有相同头和规范的另一个文件中 假设原始文件包含带有标签的条目:如何告诉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 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)