如何使用python向元素正上方的其他级别添加值或文本

如何使用python向元素正上方的其他级别添加值或文本,python,xml,Python,Xml,我有个问题。 如何在其他元素的节点末尾添加或插入属性值? 事实上,我知道怎么做,但这不是我的问题。 我想将LinkResourceURI的每个值添加到位于Link元素上方的元素Content 请参见下面的示例 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Root> <Story> <XMLElement> <Paragraph

我有个问题。 如何在其他元素的节点末尾添加或插入属性值? 事实上,我知道怎么做,但这不是我的问题。 我想将
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>

这个结果正是我所需要的

<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>

bbbbc:/test/11l.aiC:/test/222.ai
CCCC文件:C:/test/333.ai
dddd文件:C:/test/444.ai
没有错误,但这不是我想要的。 它将所有值插入所有
内容
节点


您能给我提个建议吗?

所以问题是XML的结构不是很好,标记的顺序对您想要做的事情很重要,即:复制LinkURI属性值并附加到前面内容标记的文本中

这样做的一种方法(可能还有其他方法)是迭代CharacterStyleRange标记的子级-因为这保留了子标记的序列-然后记住最近的内容标记并将LinkURI属性内容附加到该标记的文本中

此外,还可以使用findall()中的XPath缩短/简化对嵌套标记的访问

另外,我无法使您的代码正常工作,因为root.findall('Story'):
中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>

bbbbbbbb------文件:C:/test/111.ai------文件:C:/test/222.ai-----
CCCC-----文件:C:/test/333.ai-----
dddd-----文件:C:/test/444.ai-----

在解释您真正想要实现的目标时,我对您的问题不是很清楚。请编辑您的问题并添加您想要的XML,因为我无法从您所写的内容中计算出来。是否要将LinkURI属性内容复制到内容标记上的LinkURI属性中?当一个内容标记下面有多个具有LinkURI属性的标记时,会发生什么情况?并更新您的代码/输出,因为当我运行您的问题时,它找不到故事元素,所以不做任何事情,并且当我修复时,我在内容标记中获得与您显示的不同的输出-例如,有------左右当我运行你的代码时添加了什么,你没有在问题中显示出来。哦,我想我看到了你的问题-你想将LinkURI属性值插入到它们前面的内容标记中。那太可怕了。如果您可以重新构造XML,我建议将矩形标记放在它们相关的内容标记中。Barny,您理解我的意思。谢谢是的,这对我来说太难了,因为矩形标签和内容标签是同一级别的。巴尼!!这真是太棒了!!我没有想到要为此使用.tag方法。你真是个天才!我今天从你那里学到了一件事。谢谢。-你是新来的。如果我回答了你的问题,那么请考虑接受和支持我的回答。我建议你通过Python文档中的元素树教程,你会发现各种有趣的东西。好的,我一直在学习ElementTree教程,但对新手和外国人来说都很难。所有的东西都是英文的。不管怎样,我接受了你的回答。。。投票呢?这是什么。你能告诉我怎么做吗?点击选票计数上方答案左侧的向上箭头,向上投票(如果你还没有)。
<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>