我有个问题。如何在其他元素的节点末尾添加或插入属性值?事实上,我知道怎么做,但这不是我的问题。我希望将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节点中。
你能帮我提个建议吗?
发布于 2018-05-25 08:05:59
因此,问题是XML不是很好的结构,标记的顺序对您想要做的事情很重要,即:复制LinkURI属性值并附加到前面的内容标记的文本中。
这样做的一种方法(可能还有其他方法)是遍历CharacterStyleRange标记的子标记--因为这保留了子标记的序列--然后记住最近的内容标记,并将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>https://stackoverflow.com/questions/50523095
复制相似问题