Auf*_*ind 8 python lxml namespaces tostring elementtree
我有一个巨大的xml文件(1 Gig).我想将一些元素(entrys)移动到具有相同标题和规范的另一个文件.
假设原始文件包含带有标记的条目<to_move>
:
<?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>
Run Code Online (Sandbox Code Playgroud)
我使用lxml.etree.iterparse迭代文件.工作良好.当我找到带有标签的元素时<to_move>
,让我们假设它存储在element
我做的变量中
new_file.write(etree.tostring(element))
Run Code Online (Sandbox Code Playgroud)
但这导致了
<?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>
Run Code Online (Sandbox Code Playgroud)
所以问题是:如何告诉etree.tostring()不要写xmlns:="some"
.这可能吗?我使用了lxml.etree的api文档,但我找不到令人满意的答案.
这是我找到的etree.trostring
:
tostring(element_or_tree, encoding=None, method="xml",
xml_declaration=None, pretty_print=False, with_tail=True,
standalone=None, doctype=None, exclusive=False, with_comments=True)
Run Code Online (Sandbox Code Playgroud)
将元素序列化为其XML树的编码字符串表示形式.
对我来说,每一个参数tostring()
似乎都没有帮助.有任何建议或更正吗?
我经常抓住一个命名空间来为它创建一个别名,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
您可以执行类似的操作来获取命名空间,以便生成一个正则表达式,以便在使用后清理它tostring
.
或者你可以清理输入字符串.找到第一个空格,检查它是否后跟xmlns,如果是,则删除整个xmlns位直到下一个空格,如果没有删除空格.重复,直到没有空格或xmlns声明.但是不要超过第一个>
.