python lxml tree,line []创建多行,需要单行输出

时间:2015-03-02 19:10:07

标签: python xml parsing whitespace

我正在使用lxml使用python创建一个xml文件。我正在逐行解析,查找字符串,如果该字符串存在,我创建一个SubElement。我正在为SubElement分配一个值,该值在我正在搜索的字符串之后存在于已解析的文件中。

问题:如何将所有xml输出放到output.xml文件中的一行?使用行[12:]似乎是问题所在。见下面的详细信息。

每行示例文件内容:

[testclass] unique_value_horse
[testclass] unique_value_cat
[testclass] unique_value_bird

Python代码:

当我对如下所示的字符串进行硬编码时,输出xml是xml树的一个连续行。完善!见下文。

with open(file) as openfile:
    for line in openfile:
        if "[testclass]" in line:
            tagxyz = etree.SubElement(subroot, "tagxyz")
            tagxyz.text = "hardcodevalue"

当我尝试将第13个字符作为值分配时,我在每个SubElement的输出xml中得到一个新行。这导致输出xml文件的接收器出错。见下文。

with open(file) as openfile:
    for line in openfile:
        if "[testclass]" in line:
            tagxyz = etree.SubElement(subroot, "tagxyz")
            tagxyz.text = line[12:]

我认为在同一条线上进行任务可能有所帮助,但似乎并不重要。见下文。

with open(file) as openfile:
    for line in openfile:
        if "[testclass]" in line:
            etree.SubElement(subroot, "tagxyz").text = line[12:]

我尝试使用etree.XMLParser(remove_blank_text=True),并在事后解析输出xml文件并重新创建文件,但这似乎没有帮助。我明白这应该有所帮助,但要么我使用它错了,要么它实际上不会解决我的问题。见下文。

with open("output.xml", 'w') as f:
    f.write(etree.tostring(project))

parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse("output.xml", parser)

with open("output2.xml", 'w') as fl:
    fl.write(etree.tostring(tree))

1 个答案:

答案 0 :(得分:2)

您的行包含行分隔符\n。您可以使用str.rstrip()删除该行:

with open(file) as openfile:
    for line in openfile:
        if "[testclass]" in line:
            etree.SubElement(subroot, "tagxyz").text = line.rstrip('\n')

将来,使用repr() function来调试此类问题;你很容易看到它的Python转义序列所代表的换行符:

>>> line = '[testclass] unique_value_horse\n'
>>> print(line)
[testclass] unique_value_horse

>>> print(repr(line))
'[testclass] unique_value_horse\n'
>>> print(repr(line.rstrip('\n')))
'[testclass] unique_value_horse'