Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按标记内容对XML文件排序_Python_Xml_Xml Parsing - Fatal编程技术网

Python 按标记内容对XML文件排序

Python 按标记内容对XML文件排序,python,xml,xml-parsing,Python,Xml,Xml Parsing,我有很多未排序的XML文件。我想按名为“title”的标记内容对它们进行排序。我知道头衔的顺序: 1.)社论 2.)内容 3)俱乐部 等 每个文件都有另一个“标题”-内容 文件编号1的XML结构如下所示: <article> <someTags> </someTags> <title>editorial</title> </article> 社论 如何遍历所有文件并按定义的顺序对其进行排序? 文件名可以是:“sorte

我有很多未排序的XML文件。我想按名为“title”的标记内容对它们进行排序。我知道头衔的顺序: 1.)社论 2.)内容 3)俱乐部 等 每个文件都有另一个“标题”-内容

文件编号1的XML结构如下所示:

<article>
<someTags>
</someTags>
<title>editorial</title>
</article>

社论
如何遍历所有文件并按定义的顺序对其进行排序? 文件名可以是:“sorted_01.xml”、“sorted_02.xml”等等。 我怎么能得到这个? 非常感谢您的帮助!:)

使用或与返回
title
标记文本的函数一起作为键函数

import glob
import xml.etree.ElementTree as ET

def get_title(filepath):
    tree = ET.parse(filepath)
    return tree.find('.//title').text
    # Find `title` element and return the text of the element.

filepaths = glob.glob('*.xml')
print(sorted(filepaths, key=get_title))
请参阅。

另一种方法(未经测试)


对于给定的xml示例,我们无法理解xml的结构。您是否可以发布另一个至少包含2个
title
标记的示例?每个文件正好有一个title标记。内容不同。标题内容为“编辑”的文件应成为第一个文件,标题内容为“内容”的文件应成为第二个文件,依此类推:)简单地使用
for
循环(特别是当列表理解中的表达式没有产生有意义的值+有副作用时)我没有测试你的代码,但是您的代码将无法工作,因为
xpath
返回一个不可散列的列表;不能用作字典键。除此之外,代码没有填充
arr
list.update,您的两条评论都是正确的(还有您的代码):)谢谢@falsetruor我误解了。:)但是如何确定文件的保存顺序呢?我的意思是:包含“编辑”-标题内容的文件应保存为01.xml,包含“内容”-标题内容的文件应保存为“02.xml”,依此类推。我必须在列表中保存标签内容的顺序,不是吗?顺便说一句:谢谢你的帮助!:)@马克,我好像误解了你的问题。看看盖伊·加弗里利的答案。
import glob, os
from lxml import etree
d = {}
titles = ['editorial', 'content' , 'club', ...] # ordered titles
for fname in glob.glob('*.xml'):
     tree = etree.parse(fname)
     title = tree.xpath('//title/text()')[0]
     subtitle = tree.xpath('//subtitle/text()')[0]
     key = '%s_%s' % (title, subtitle)
     d[key] = fname
for idx,title in enumerate(titles, 1):
     os.rename(d[title], 'sorted_%02d.xml' % idx)