python - 从其他属性创建新的 xml 属性
问题描述
我有以下 XML
<icim source="source">
<object class="class_name" name="class_name">
<attribute name="Type">
<string>Type_Name</string>
</attribute>
<attribute name="DisplayName">
<string>DisplayName</string>
</attribute>
<attribute name="Vendor">
<string>Vendor_Name</string>
</attribute>
<attribute name="Model">
<string>Model_Name</string>
</attribute>
<attribute name="Description">
<string>Description_part1, Description_part2, Description_part3, Description_part4, Description_part5</string>
</attribute>
</object>
<object class="class_name" name="class_name">
<attribute name="Type">
<string>Type_Name</string>
</attribute>
<attribute name="DisplayName">
<DisplayName</string>
</attribute>
<attribute name="Vendor">
<string>Vendor_Name</string>
</attribute>
<attribute name="Model">
<string>Model_Name</string>
</attribute>
<attribute name="Description">
<string>Description_part1, Description_part2, Description_part3, Description_part4, Description_part5</string>
</attribute>
</object>
.
.
.
</icim>
我想使用 Python 的元素树将其转换为:
<icim source="source">
<object class="class_name" name="class_name">
<attribute name="Type">
<string>Type_Name</string>
</attribute>
<attribute name="DisplayName">
<string>DisplayName</string>
</attribute>
<attribute name="Vendor">
<string>Vendor_Name</string>
</attribute>
<attribute name="Model">
<string>Model_Name</string>
</attribute>
<attribute name="String1">
<string>Description_part1</string>
</attribute>
</attribute>
<attribute name="String2">
<string>Description_part2</string>
</attribute>
</attribute>
<attribute name="String3">
<string>Description_part3</string>
</attribute>
<attribute name="Description">
<string>Description_part1, Description_part2, Description_part3, Description_part4, Description_part5</string>
</attribute>
</object>
<object class="class_name" name="class_name">
<attribute name="Type">
<string>Type_Name</string>
</attribute>
<attribute name="DisplayName">
<DisplayName</string>
</attribute>
<attribute name="Vendor">
<string>Vendor_Name</string>
</attribute>
<attribute name="Model">
<string>Model_Name</string>
</attribute>
</attribute>
<attribute name="String1">
<string>Description_part1</string>
</attribute>
</attribute>
<attribute name="String2">
<string>Description_part2</string>
</attribute>
</attribute>
<attribute name="String3">
<string>Description_part3</string>
</attribute>
<attribute name="Description">
<string>Description_part1, Description_part2, Description_part3, Description_part4, Description_part5</string>
</attribute>
</object>
.
.
.
</icim>
也就是说,我想从每个描述元素中提取前三个字符串部分(描述总是有逗号,因此您可以根据这些部分拆分部分)并为前 3 个描述部分中的每一个创建一个新属性。想法?
解决方案
您的 xml 和预期的 xml 格式不正确(<DisplayName</string>
应该是 <string>DisplayName</string>
),但假设它是固定的,如果我理解正确,以下内容至少可以帮助您:
from lxml import etree
display = """[your xml above, corrected]"""
doc = etree.XML(display)
objs = doc.xpath("//object")
for obj in objs:
news = obj.xpath('.//attribute[@ name="Description"]/string/text()')[0].split(',')[:3]
counter=3
for new in reversed(news): #this list needs to be reversed to get the new elements into the xml in the correct order
ins = etree.fromstring(f'<attribute name="String{counter}">\n <string>{new.strip()}</string>\n</attribute>\n')
obj.insert(4,ins)
counter-=1 #same reason for counting in reverse
print(etree.tostring(doc).decode())
输出应该是您预期的输出。
推荐阅读
- python - python代码将终止用户输入的另一个进程(例如chrome.exe)?
- go - 在 main 中找不到包
- c# - 从属性调整数组大小
- c++ - 2d Kadane 算法中的逻辑错误有什么问题?
- sql - 获取 array_agg 以根据另一列过滤重复项
- javascript - 条件或语句的困难
- python - 如果所有列都有空字符串,则从熊猫数据框中删除行
- jquery - React 可以检测到使用 jQuery 对组件属性所做的更改吗?
- javascript - 使用 jquery 动画创建深度错觉
- webpack - 如何使用 Webpack 的 `raw-loader` 加载二进制文件?