我有一个巨大的xml文件(1 Gig)。我想将某些元素(条目)移动到具有相同标题和规范的另一个文件中。
假设原始文件包含带有<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>
我使用lxml.etree.iterparse遍历文件。工作良好。当我找到带有标签
<to_move>
的元素时,假定它存储在我做的变量element
中new_file.write(etree.tostring(element))
但这导致
<?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>
所以问题是:如何告诉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)
对我来说,
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)
您可以执行类似的操作来获取 namespace ,以创建一个正则表达式,以便在使用
tostring
之后对其进行清理。或者您可以清理输入字符串。查找第一个空格,检查是否紧跟着xmlns,如果是,则删除整个xmlns,直到下一个空格,如果否,则删除该空格。重复直到不再有空格或xmlns声明。但是不要超过第一个
>
。关于python - 如何告诉lxml.etree.tostring(element)不要在python中编写 namespace ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7004215/