我有一个问题。
如何在其他元素的节点末尾添加或插入属性值?
事实上,我知道该怎么做,但这不是我的问题。
我想将 LinkResourceURI
的每个值添加到位于 Link
元素上方的元素 Content
中。
请参阅以下示例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<Story>
<XMLElement>
<ParagraphStyleRange>
<XMLElement>
<CharacterStyleRange>
<Content>BBBBBBBBBB </Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/111.ai"/>
</PDF>
</Rectangle>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/222.ai"/>
</PDF>
</Rectangle>
<Content>CCCCCCCCCC </Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/333.ai"/>
</PDF>
</Rectangle>
</CharacterStyleRange>
<CharacterStyleRange>
<Content>DDDDDDDDDD</Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/444.ai"/>
</PDF>
</Rectangle>
</CharacterStyleRange>
</XMLElement>
</ParagraphStyleRange>
</XMLElement>
</Story>
</Root>
这就是我正在尝试编码的内容。
import xml.etree.ElementTree as ET
tree = ET.parse("c:\\TEST\\XML_data.xml")
root = tree.getroot()
for Story in root.findall('Story'):
for XMLElement in Story.findall('XMLElement'):
for ParagraphStyleRange in XMLElement.findall('ParagraphStyleRange'):
for XMLElement_1 in ParagraphStyleRange.findall('XMLElement'):
for CharacterStyleRange in XMLElement_1.findall('CharacterStyleRange'):
for Rectangle in CharacterStyleRange.findall('Rectangle'):
for PDF in Rectangle.findall('PDF'):
for Link in PDF.findall('Link'):
Link_URL = Link.get('LinkResourceURI')
Link_count = len(PDF.findall('Link'))
print(Link_count)
if int(Link_count) >= 1 :
for CharacterStyleRange in XMLElement_1.findall('CharacterStyleRange'):
for Content in CharacterStyleRange.findall('Content'):
Content.text = str(Content.text)+ '-----' + Link_URL + '-----'
else :
pass
tree.write('C:\\test\\datafiles\\Link_test_result.xml')
这个结果就是我需要的。
<Story>
<XMLElement>
<ParagraphStyleRange>
<XMLElement>
<CharacterStyleRange>
<Content>BBBBBBBBBB C:/test/11l.aiC:/test/222.ai</Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/111.ai"/>
</PDF>
</Rectangle>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/222.ai"/>
</PDF>
</Rectangle>
<Content>CCCCCCCCCC file:C:/test/333.ai</Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/333.ai"/>
</PDF>
</Rectangle>
</CharacterStyleRange>
<CharacterStyleRange>
<Content>DDDDDDDDDDfile:C:/test/444.ai</Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/444.ai"/>
</PDF>
</Rectangle>
</CharacterStyleRange>
</XMLElement>
</ParagraphStyleRange>
</XMLElement>
</Story>
没有错误,但这不是我想要的。
它将所有值插入到所有 Content
节点中。
你能给我建议吗?
最佳答案
所以问题是 XML 的 IMO 结构不是很好,并且标记的顺序对于您想要执行的操作很重要,即:复制 LinkURI 属性值并附加到前面的 Content 标记的文本。
实现此目的的一种方法(可能还有其他方法)是迭代 CharacterStyleRange 标记的子标记 - 因为这会保留子标记的顺序 - 然后记住最新的 Content 标记并将 LinkURI 属性内容附加到该标签的文本。
此外,您还可以在 findall() 中使用 XPath 来缩短/简化对嵌套标记的访问。
另外,我无法让你的代码工作,因为最初的 for Story in root.findall('Story'):
没有返回任何东西。
无论如何,这段代码:
import xml.etree.ElementTree as ET
tree = ET.parse("XML_data.xml")
root = tree.getroot()
for CharacterStyleRange in root.findall('.//CharacterStyleRange'):
# iterate through the children so we can work with the sequence of Content and Rectangle tags
for child in CharacterStyleRange:
if child.tag == 'Content':
# remember the preceding content tag
thecontent = child
elif child.tag == 'Rectangle':
for Link in child.findall('.//Link'):
Link_URL = Link.get('LinkResourceURI')
# append the attribute value to the preceding content tag
thecontent.text += '-----' + Link_URL + '-----'
tree.write('Link_test_result.xml')
产生此输出:
<Story>
<XMLElement>
<ParagraphStyleRange>
<XMLElement>
<CharacterStyleRange>
<Content>BBBBBBBBBB -----file:C:/test/111.ai----------file:C:/test/222.ai-----</Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/111.ai" />
</PDF>
</Rectangle>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/222.ai" />
</PDF>
</Rectangle>
<Content>CCCCCCCCCC -----file:C:/test/333.ai-----</Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/333.ai" />
</PDF>
</Rectangle>
</CharacterStyleRange>
<CharacterStyleRange>
<Content>DDDDDDDDDD-----file:C:/test/444.ai-----</Content>
<Rectangle>
<PDF>
<Link LinkResourceURI="file:C:/test/444.ai" />
</PDF>
</Rectangle>
</CharacterStyleRange>
</XMLElement>
</ParagraphStyleRange>
</XMLElement>
</Story>
关于python - 如何使用 python 将值或文本添加到元素上方的其他级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50523095/