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

标签 python xml

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

相关文章:

python - 循环遍历两个列表,我想从每个列表中弹出

Java SHA256 生成与 Python 中不同的哈希值

python - 从脚本运行 scrapy 时内存溢出

xml - Spring Servlet-Context.xml 报错Cannot locate BeanDefinitionParser for element [import]

java - 使用Java获取不基于命名空间的xml标签

xml - 如何使用 Scala 创建 xhtml 查询字符串?

python - 单元测试 Django 时区感知日期时间

python - 为 Jupyter (Anaconda) 安装 Scala 内核(或 Spark/Toree)

android - 如何在 Android XML 中创建固定高度的垂直线?

xml - 用于在 XML 中查找和替换标记值的 Perl 代码