我有一个巨大的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/

10-12 19:32