我有一个名为vs_origonal_M.xml的主xml文件,我想添加某个子对象的所有类型
<location>
</location>
<location>
</location>
.
.
.
<location>
</location>
直到所有的文件都被看过。在
我首先打开目录,然后列出目录中的所有文件,然后检查它们是否确实是xml文件,然后将某个子文件取出。然后(这里是我遇到的问题)我需要打开主文件并将这个子文件插入到同名的最后一个子文件下,最后当所有操作完成后,我需要保存主xml文件
代码如下:
^{pr2}$
Tags:
可能有更好的方法来完成您真正想要做的事情特别是,您的真正的XML很可能有一个
<locations>
标记,所有的<location>
标记都在下面,因此根本没有理由搜索最后一个<location>
标记但你要怎么做。在
这大部分都很简单。您必须找到最后一个
location
节点的父节点,然后您可以append
另一个节点。在唯一棘手的地方是
find
中的XPath表达式,所以让我为您详细介绍一下(但是您必须阅读文档才能真正理解它!)公司名称:.//
表示“当前节点的后代”。(从技术上讲,您应该能够只使用//
作为“根的后代”,但是早期版本的etree中存在bug,因此这样更安全。)*
表示“具有任何标记名”。在[location]
表示“带子”位置标记。(当然,我使用format
方法填充子元素的根标记。如果您知道您的所有子对象都以location
为根,则可以硬编码标记名,并将find
移出循环。)[last()]
表示“最后一个”。在所以,把它们放在一起,这是根的最后一个后代,具有子“location”标记的任何名称。在
如果您不了解XPath,您可以随时手动迭代以获得相同的效果,但这将花费更长的时间,并且更容易引入细微的错误,因此学习XPath确实值得。在
我在你的程序里改变了很多其他的东西。让我解释一下:
没有理由做
if foo: return True
else: 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
或{==
运算符的结果,只需直接检查它。在相关问题 更多 >
编程相关推荐