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

时间:2018-05-25 06:49:23

标签: python xml

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

你能为我提供建议吗?

1 个答案:

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