python - 使用 python,除一个元素外,按字母顺序对 XML 进行排序

标签 python xml sorting alphabetical

我正在尝试按字母顺序对 XML 进行排序,同时确保特定元素位于顶部。我已经设法按字母顺序对其进行排序,但我无法保留该元素。这是我目前所拥有的:

from lxml import etree

data = """
<Example xmlns="http://www.example.org">
    <E>
        <A>A</A>
        <B>B</B>
        <C>C</C>
    </E>
    <B>B</B>
    <D>D</D>
    <A>A</A>
    <C>C</C>
    <F>F</F>
</Example>
"""
doc = etree.XML(data,etree.XMLParser(remove_blank_text=True))

for parent in doc.xpath('//*[./*]'):
    parent[:] = sorted(parent,key=lambda x: x.tag)

print etree.tostring(doc,pretty_print=True)

结果是:

<Example xmlns="http://www.example.org">
  <A>A</A>
  <B>B</B>
  <C>C</C>
  <D>D</D>
  <E>
    <A>A</A>
    <B>B</B>
    <C>1</C>
  </E>
  <F>F</F>
</Example>

无论如何我可以阻止 <E></E>部分及其内容不移动?

最佳答案

您至少可以通过两种方式处理此问题。您可以对所有内容进行排序,然后强制 <E>通过自定义排序功能到顶部。也可以将待排序的元素拆分,排序后追加到未排序元素的末尾。

自定义排序:

使用渐进代码点对文本进行排序。您可以使用 ord() 获取单个字符的代码点。 .最低的打印字符是制表符。所以对于排序,我们可以告诉 python 正常排序所有元素,除非 tag<E> , 然后使用 tab用于排序,哪个将首先排序。

有一些额外的代码来处理命名空间。

doc = etree.XML(data,etree.XMLParser(remove_blank_text=True))
ns = doc.nsmap

for parent in doc.xpath('//*[./*]'):
    parent[:] = sorted(parent,key=lambda x: x.tag if x.tag!='{'+ns[None]+'}E' else '\t')

print(etree.tostring(doc,pretty_print=True).decode('ascii'))

<Example xmlns="http://www.example.org">
  <E>
    <A>A</A>
    <B>B</B>
    <C>C</C>
  </E>
  <A>A</A>
  <B>B</B>
  <C>C</C>
  <D>D</D>
  <F>F</F>
</Example>

拆分、应用、合并

这里我们将父级拆分为两个列表,对第二个列表进行排序,然后合并它们。

doc = etree.XML(data,etree.XMLParser(remove_blank_text=True))
ns = doc.nsmap
for parent in doc.xpath('//*[./*]'):
    to_sort = (e for e in parent if e.tag!='{'+ns[None]+'}E')
    non_sort = (e for e in parent if e.tag=='{'+ns[None]+'}E')
    parent[:] = list(non_sort) + sorted(to_sort, key=lambda e: e.tag)
print(etree.tostring(doc,pretty_print=True).decode('ascii'))

<Example xmlns="http://www.example.org">
  <E>
    <A>A</A>
    <B>B</B>
    <C>C</C>
  </E>
  <A>A</A>
  <B>B</B>
  <C>C</C>
  <D>D</D>
  <F>F</F>
</Example>

关于python - 使用 python,除一个元素外,按字母顺序对 XML 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46080301/

相关文章:

python - 无法 webdriver.get(url) Selenium 3 中的 IP 地址

xml - Office 2007/2010 自定义功能区 UI 如何更改选项卡颜色 XML 标签

xml - 设置 nillable ="false"时未进行 XSD 验证

algorithm - 在许多排序数组中进行二进制搜索

python - scipy 稀疏矩阵中行的 L2 归一化

python - 发布请求 Django REST 框架

python - Django-注册。发送的激活链接缺少我的应用名称

java - 如何在android中自定义UI大小元素

python - 当一个属性是模型方法时 Django QuerySet 的升序/降序排序

c++ - qSort() 不适用于自己的比较函数