我有一个问题。
如何在其他元素的节点末尾添加或插入属性值?
实际上,我知道怎么做,但这不是我的问题。
我想将LinkResourceURI
的每个值添加到位于Content
元素上方的元素Link
。
请参阅以下示例
<?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
节点中。
你能为我提供建议吗?
答案 0 :(得分:2)
所以问题是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>