获取 ElementTree 中的最后一个标签并追加文本
Getting the last tag in ElementTree and append text
我有一些 XML 具有以下结构:
<root>
<parent-1>
<text>blah-1</text>
<properties>
<property type="R" id="0005">text-value-A</property>
<property type="W" id="0003">text-value-B</property>
<property type="H" id="0002">text-value-C</property>
<property type="W" id="0008">text-value-D</property>
</properties>
</parent-1>
<parent-2>
<text>blah-2</text>
<properties>
<property type="W" id="0004">text-value-A</property>
<property type="H" id="0087">text-value-B</property>
</properties>
</parent-2>
<parent-3>
<text>blah-3</text>
<properties>
<property type="H" id="0087">text-value-C</property>
<property type="R" id="0008">text-value-A</property>
</properties>
</parent-3>
<parent-4>
<text>blah-4</text>
<properties>
<property type="H" id="0019">text-value-C</property>
<property type="R" id="0060">text-value-A</property>
</properties>
</parent-4>
</root>
目前,我正在解析 text-value-
并将它们与一些字符串 !
连接起来,但是 text-value-X
最后出现在 properties 级别,我需要分配一些其他字符串 &
,并输出如下内容:
text-value-A!text-value-B!text-value-C!text-value-D&text-value-A!text-value-B&text-value-C!text-value-A
.
由于 <property
中的属性不能特定于 tags/have 随机值,因此 if(item.text == 'text-value-A') #get text-value-A of parent-3
之类的东西将不起作用。
------------
我不保留重复的 text-value-
(在这种情况下不需要 parent-4
,因为 parent-3
的 text-value-
是相同的)并且我想保留顺序,因此 enumerate
我正在执行以下操作:
alist = []
for item in root.findall('parent/properties/property'):
alist.append(item.text)
self.alist = '!'.join([a for b,a in enumerate(alist) if a not in alist[:b]]
鉴于上面的期望输出,我想知道我是否需要一个不同的方法来解决这个问题,或者像下面这样的概念会以某种方式起作用:
alist = []
for item in root.findall('parent/properties/property'):
alist.append(item.text)
for element in alist:
if element in alist[-1]:
self.alist = '&'.join([a for b,a in enumerate(alist) if a not in alist[:b]]
if not element in alist[-1]:
self.alist = '!'.join([a for b,a in enumerate(alist) if a not in alist[:b]]
谢谢
这可能就是您想要的。
- xpath 公式“.//properties”生成一个包含四个元素的列表。
property_texts
将包含每个文本的列表。
any
谓词用于测试当前属性的文本集是否已被看过。如果不是,那么这些文本将作为列表添加到集合中。 (重要的是使用 set
逻辑来避免遗漏不同顺序的重复集。)
from xml.etree import ElementTree
tree = ElementTree.parse('bt123.xml')
property_text_lists = []
for properties in tree.findall('.//properties'):
property_texts = [p.text for p in properties]
if any([set(property_texts)==set(ptl) for ptl in property_text_lists]):
break
property_text_lists.append(property_texts)
print ('&'.join(['!'.join(property_text_lists[i]) for i in range(len(property_text_lists))]))
它确实产生了这个输出。
text-value-A!text-value-B!text-value-C!text-value-D&text-value-A!text-value-B&text-value-C!text-value-A
我有一些 XML 具有以下结构:
<root>
<parent-1>
<text>blah-1</text>
<properties>
<property type="R" id="0005">text-value-A</property>
<property type="W" id="0003">text-value-B</property>
<property type="H" id="0002">text-value-C</property>
<property type="W" id="0008">text-value-D</property>
</properties>
</parent-1>
<parent-2>
<text>blah-2</text>
<properties>
<property type="W" id="0004">text-value-A</property>
<property type="H" id="0087">text-value-B</property>
</properties>
</parent-2>
<parent-3>
<text>blah-3</text>
<properties>
<property type="H" id="0087">text-value-C</property>
<property type="R" id="0008">text-value-A</property>
</properties>
</parent-3>
<parent-4>
<text>blah-4</text>
<properties>
<property type="H" id="0019">text-value-C</property>
<property type="R" id="0060">text-value-A</property>
</properties>
</parent-4>
</root>
目前,我正在解析 text-value-
并将它们与一些字符串 !
连接起来,但是 text-value-X
最后出现在 properties 级别,我需要分配一些其他字符串 &
,并输出如下内容:
text-value-A!text-value-B!text-value-C!text-value-D&text-value-A!text-value-B&text-value-C!text-value-A
.
由于 <property
中的属性不能特定于 tags/have 随机值,因此 if(item.text == 'text-value-A') #get text-value-A of parent-3
之类的东西将不起作用。
------------
我不保留重复的 text-value-
(在这种情况下不需要 parent-4
,因为 parent-3
的 text-value-
是相同的)并且我想保留顺序,因此 enumerate
我正在执行以下操作:
alist = []
for item in root.findall('parent/properties/property'):
alist.append(item.text)
self.alist = '!'.join([a for b,a in enumerate(alist) if a not in alist[:b]]
鉴于上面的期望输出,我想知道我是否需要一个不同的方法来解决这个问题,或者像下面这样的概念会以某种方式起作用:
alist = []
for item in root.findall('parent/properties/property'):
alist.append(item.text)
for element in alist:
if element in alist[-1]:
self.alist = '&'.join([a for b,a in enumerate(alist) if a not in alist[:b]]
if not element in alist[-1]:
self.alist = '!'.join([a for b,a in enumerate(alist) if a not in alist[:b]]
谢谢
这可能就是您想要的。
- xpath 公式“.//properties”生成一个包含四个元素的列表。
property_texts
将包含每个文本的列表。any
谓词用于测试当前属性的文本集是否已被看过。如果不是,那么这些文本将作为列表添加到集合中。 (重要的是使用set
逻辑来避免遗漏不同顺序的重复集。)
from xml.etree import ElementTree
tree = ElementTree.parse('bt123.xml')
property_text_lists = []
for properties in tree.findall('.//properties'):
property_texts = [p.text for p in properties]
if any([set(property_texts)==set(ptl) for ptl in property_text_lists]):
break
property_text_lists.append(property_texts)
print ('&'.join(['!'.join(property_text_lists[i]) for i in range(len(property_text_lists))]))
它确实产生了这个输出。
text-value-A!text-value-B!text-value-C!text-value-D&text-value-A!text-value-B&text-value-C!text-value-A