从python中的for循环添加到origonalxml文件

2024-10-01 09:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为vs_origonal_M.xml的主xml文件,我想添加某个子对象的所有类型

<location>  
</location>
<location>
</location>
.
.
.
<location>
</location>

直到所有的文件都被看过。在

我首先打开目录,然后列出目录中的所有文件,然后检查它们是否确实是xml文件,然后将某个子文件取出。然后(这里是我遇到的问题)我需要打开主文件并将这个子文件插入到同名的最后一个子文件下,最后当所有操作完成后,我需要保存主xml文件

代码如下:

^{pr2}$

Tags: 文件对象代码目录类型locationxmlvs
1条回答
网友
1楼 · 发布于 2024-10-01 09:21:19

可能有更好的方法来完成您真正想要做的事情特别是,您的真正的XML很可能有一个<locations>标记,所有的<location>标记都在下面,因此根本没有理由搜索最后一个<location>标记

但你要怎么做。在

os.chdir('c:/Users/ME/Documents/XML_Parasing_Python/')
origname = 'vs_original_M.xml'
master = ET.parse(origname)
for path in os.listdir('.'):
    if path != origname and os.path.splitext(path)[-1] == '.xml':
        child = ET.parse(path)
        root = child.getroot()
        last_location_parent = master.find('.//*[{}][last()]'.format(root.tag))
        last_location_parent.append(root)
master.write('master.xml')

这大部分都很简单。您必须找到最后一个location节点的父节点,然后您可以append另一个节点。在

唯一棘手的地方是find中的XPath表达式,所以让我为您详细介绍一下(但是您必须阅读文档才能真正理解它!)公司名称:

  • .//表示“当前节点的后代”。(从技术上讲,您应该能够只使用//作为“根的后代”,但是早期版本的etree中存在bug,因此这样更安全。)
  • *表示“具有任何标记名”。在
  • [location]表示“带子”位置标记。(当然,我使用format方法填充子元素的根标记。如果您知道您的所有子对象都以location为根,则可以硬编码标记名,并将find移出循环。)
  • [last()]表示“最后一个”。在

所以,把它们放在一起,这是根的最后一个后代,具有子“location”标记的任何名称。在


如果您不了解XPath,您可以随时手动迭代以获得相同的效果,但这将花费更长的时间,并且更容易引入细微的错误,因此学习XPath确实值得。在


我在你的程序里改变了很多其他的东西。让我解释一下:

没有理由做if foo: return Trueelse: return False;你可以做return foo。但这意味着你的整个函数只是return HART_filename.endswith('.xml'),所以你甚至不需要一个函数。在路径上使用os.path.splitext这样的路径函数比使用字符串函数要好。在

如果您使用for number in range(1, xml_list_length),则不需要在开始处使用number = 1,并且在循环中不需要{};for语句已经为您做到了这一点。在

但无论如何也不希望从1开始;Python列表是从0开始索引的。如果您使用它来跳过vs_original_M.xml,那么只有幸运的时候才会起作用;listdir返回内容的顺序是未指定和任意的。跳过具有特定名称的文件的唯一方法是检查其名称。在

你几乎不想循环range(len(foo))。如果您只需要foo的元素,只需执行for element in foo。如果还需要每个元素的索引,请执行for index, element in enumerate(foo)。在

最后,您几乎不应该检查if foo == True。在Python中,除了True(数字74,字符串“hello”等等)之外,还有很多东西是“truthy”的,您可以使用if foo来检查foo是否是真的。只有当您显式地想要确保它失败或其他真实值时才使用== True;如果您只想检查像is_xml或{}之类的布尔函数或==运算符的结果,只需直接检查它。在

相关问题 更多 >