2017-09-27 5 views
0

ich eine XML-Datei, die ich einige Elemente, die vorher kommentiert, und jetzt will ich sie Kommentar- ..Entfernen Sie alle Kommentare in Python 3 lxml

ich diese Struktur haben

<parent parId="22" attr="Alpha"> 
<!--<reg regId="1"> 
    <cont>There is some content</cont><cont2 attr1="val">Another content</cont2> 
</reg> 
--></parent> 
<parent parId="23" attr="Alpha"> 
<reg regId="1"> 
    <cont>There is more content</cont><cont2 attr1="noval">Morecont</cont2> 
</reg> 
</parent> 
<parent parId="24" attr="Alpha"> 
<!--<reg regId="1"> 
    <cont>There is some content</cont><cont2 attr1="val">Another content</cont2> 
</reg> 
--></parent> 

Ich möchte Kommentieren Sie alle Kommentare der Datei. Das ist auch das kommentierte Element und ich möchte sie auskommentieren.

Ich bin in der Lage, die Elemente zu finden, die Kommentar mit Xpath sind. Hier ist mein Codeschnipsel.

def unhide_element(): 
    path = r'path_to_file\file.xml' 
    xml_parser = et.parse(path) 
    comments = root.xpath('//comment') 
    for c in comments: 
     print('Comment: ', c) 
     parent_comment = c.getparent() 
     parent_comment.replace(c,'') 
     tree = et.ElementTree(root) 
     tree.write(new_file) 

Die Ersetzung funktioniert jedoch nicht, da ein anderes Element erwartet wird.

Wie kann ich das beheben?

Antwort

2

Ihrem Code fehlt ein entscheidendes Bit zum Erstellen des neuen XML-Elements aus Kommentartext. Es gibt einige andere Fehler, die sich auf die falsche XPath-Abfrage beziehen und die Ausgabedatei mehrmals in der Schleife speichern.

Auch scheint es, dass Sie mit lxml.etree mischen. Wie in documentation ignoriert der erste Kommentar, wenn die XML-Datei geparst wird, also ist der beste Weg zu gehen, lxml zu verwenden.

Nachdem wir alle oben genannten Dinge behoben haben, bekommen wir so etwas.

import lxml.etree as ET 


def unhide_element(): 
    path = r'test.xml' 
    root = ET.parse(path) 
    comments = root.xpath('//comment()') 
    for c in comments: 
     print('Comment: ', c) 
     parent_comment = c.getparent() 
     parent_comment.remove(c) # skip this if you want to retain the comment 
     new_elem = ET.XML(c.text) # this bit creates the new element from comment text 
     parent_comment.addnext(new_elem) 

    root.write(r'new_file.xml') 
+0

Großartig, das hat funktioniert. Ich weiß jedoch nicht, warum meine lxml-Version nicht funktioniert, wenn ich zuerst die Datei "root"() verwende. Ich kann nicht direkt im ElementTree mit Parse arbeiten. – TMikonos

0

Nun, da Sie alles Kommentar- wollen, alles, was Sie wirklich tun müssen, ist jedes "<! -" entfernen und "->":

import re 

new_xml = ''.join(re.split('<!--|-->', xml)) 

Oder:

new_xml = xml.replace('<!--', '').replace('-->', '') 
Verwandte Themen