Hier ist mein Anwendungsfall:
Ich habe eine potenziell große XML -Datei und möchte die Häufigkeit aller eindeutigen strukturellen Variationen eines bestimmten Elementtyps ausgeben. Elementattribute sollten als Teil des Einzigartigkeitstests aufgenommen werden. Die Ausgabe sollte die Variationen nach Frequenz sortieren. < /P>
Hier ist ein triviales Eingabebuch
20192
2005
red
1098
2018
blue
17964
2012
salvage
198026
1990
< /code>
Die Ausgabe, die ich erwarte, würde so aussehen: < /p>
< /code>
Ich habe den Code mit iTerParse implementiert, aber wenn er die Elemente verarbeitet, existieren die Attribute im Element nicht. Die Codelogik scheint korrekt zu sein, aber Attribute existieren einfach nicht. Sie sind nicht in der Ausgabe geschrieben und sind für den Einzigartigkeitstest nicht vorhanden. Laut dem obigen Eingangsbeispiel bekomme ich die Ausgabe: < /p>
< /code>
Die Verwendung ist: < /p>
xplore.py input.xml node_to_explore
< /code>
Im obigen Beispiel habe ich verwendet: < /p>
xplore.py trivial.xml automobile
< /code>
Hier ist die Quelle: < /p>
from lxml import etree
import sys
import re
from datetime import datetime
# global node signature map
structure_map = {}
# global code frequency map
frequency_map = {}
# output tree
tmp_root = etree.Element("tmp_root")
def process_element(el):
global target
if el.tag != target:
return
# get the structure of the element
structure = get_structure(el)
global structure_map
structure_key = etree.tostring(structure, pretty_print=True)
if structure_key not in structure_map.keys():
# add signature to structure map
structure_map[structure_key] = structure
# add node to output
global tmp_root
tmp_root.append(structure)
# add signature to frequency map
frequency_map[structure_key] = 1
else:
# increment frequency map
frequency_map[structure_key] += 1
# returns a unique string representing the structure of the node
# including attributes
def get_structure(el):
# create new element for the return value
ret = etree.Element(el.tag)
# get attributes
attribute_keys = el.attrib.keys()
for attribute_key in attribute_keys:
ret.set(attribute_key, el.get(attribute_key))
# check for children
children = list(el)
for child in children:
ret.append(get_structure(child))
return ret
if len(sys.argv) < 3:
print "Must specify an XML file for processing, as well as an element type!"
exit(0)
# Get XML file
xml = sys.argv[1]
# Get output file name
output_file = xml[0:xml.rindex(".")]+".txt"
# get target element type to evaluate
target = sys.argv[2]
# mark start
startTime = datetime.now()
# Parse XML
print '==========================='
print 'Parsing XML'
print '==========================='
context = etree.iterparse(xml, events=('end',))
for event, element in context:
process_element(element)
element.clear()
# create tree sorted by frequency
ranked = sorted(frequency_map.items(), key=lambda x: x[1], reverse=True)
root = etree.Element("root")
for item in ranked:
structure = structure_map[item[0]]
structure.set(target+"_frequency", str(item[1]))
root.append(structure)
# pretty print root
out = open(output_file, 'w')
out.write(etree.tostring(root, pretty_print=True))
# output run time
time = datetime.now() - startTime
reg3 = re.compile("\\d+:\\d(\\d:\\d+\\.\\d{4})")
time = re.search(reg3, unicode(time))
time = "Runtime: %ss" % (time.group(1).encode("utf-8"))
print(time)
< /code>
Im Debugger kann ich deutlich erkennen, dass die Attribute in den Aufrufen in den Aufrufen von get_structure fehlen. Kann mir jemand sagen, warum dies der Fall ist?
Elementattribute fehlen beim Parsen von XML mit IterParse/LXML/Python 2 ⇐ Python
-
- Similar Topics
- Replies
- Views
- Last post