<" /> <" /> <"/>

How to add an element to an existing xml file at specific locations using python?

165 views Asked by At

part of word document xml:

    <w:p w14:paraId="1A403538" w14:textId="03591853" w:rsidR="00280630" w:rsidRDefault="00280630" w:rsidP="00280630">
        <w:pPr>
            <w:pStyle w:val="Heading1"/>
            <w:rPr>
                <w:lang w:val="en-US"/>
            </w:rPr>
        </w:pPr>
        <w:r>
            <w:rPr>
                <w:lang w:val="en-US"/>
            </w:rPr>
            <w:lastRenderedPageBreak/>
            <w:t>Chapter to Hide</w:t>
        </w:r>
    </w:p>

I would like to add a <w:vanish/> element programmatically where it is seen below:

    <w:p w14:paraId="1A403538" w14:textId="03591853" w:rsidR="00280630" w:rsidRPr="000E4C6C" w:rsidRDefault="00280630" w:rsidP="00280630">
        <w:pPr>
            <w:pStyle w:val="Heading1"/>
            <w:rPr>
                <w:vanish/>
                <w:lang w:val="en-US"/>
            </w:rPr>
        </w:pPr>
        <w:r w:rsidRPr="000E4C6C">
            <w:rPr>
                <w:vanish/>
                <w:lang w:val="en-US"/>
            </w:rPr>
            <w:lastRenderedPageBreak/>
            <w:t>Chapter to Hide</w:t>
        </w:r>
    </w:p>

What I want to do would be something like this:

from docx import Document
doc = Document("invitation.docx")
for paragraph in doc.paragraphs:
    p = paragraph._element
    if '''(paraId == "1A403538")''':
        run_pr = p.xpath('./w:pPr/w:rPr')
        # append <vanish/>

Something I tried:

import xml.etree.ElementTree as ET
from xml.dom import minidom

trees = minidom.parse("document.xml")
tagnames = trees.getElementsByTagName("w:rPr")

for tag in tagnames:
    child = ET.fromstring("<vanish/>")
    tag.appendChild(child)

I get the following error from line tag.appendChild(child):

AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'nodeType'
0

There are 0 answers