/ / LXML-Problem beim Parsen des XML-Schemas in Python 3 - python, xml, python-3.x, python-2.7, lxml

LXML-Problem bei der Analyse des XML-Schemas in Python 3 - Python, XML, Python-3.x, Python-2.7, Lxml

Ich versuche den zu benutzen XRDTools Bibliothek, um Panalytical XRDML-Dateien in ein datenbankfreundlicheres Format wie einen Pandas-Datenrahmen zu konvertieren.

Die XRDTools-Bibliothek wird hier beschrieben: https://github.com/paruch-group/xrdtools. Es importiert die XRDML-Datei in ein Python-Wörterbuch. Ich bin total neu in LXML, also entschuldige ich mich, wenn das eine einfache Frage ist.

Ich habe Anaconda verwendet, um Python 2.7 und 3.6 Umgebungen speziell für das XRDTools-Paket zu erstellen. Ich würde es gerne in Python 3.6 ausführen.

In Python 2.7 läuft dieser Code reibungslos:

import xrdtools
xrd = xrdtools.read_xrdml("filename.xrdml")

Ausgabe ist a dict:

{u"2Theta": array([63.        , 63.00334225, 63.00668449, ..., 67.99331551,
67.99665775, 68.        ]),
u"Lambda": 1.540598,
u"Omega": array([31.        , 31.00200535, 31.0040107 , ..., 33.9959893 ,
33.99799465, 34.        ]), ...

Ich kann das Wörterbuch dann wie jedes andere Python-Objekt verwenden.

In Python 3.6 erzeugt der gleiche Code diese Fehlermeldung:

Traceback (most recent call last):

File "...AppDataLocalContinuumAnaconda2envspy36xrdlibsite-packagesIPythoncoreinteractiveshell.py", line 2910, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)

File "<ipython-input-3-b6f5409b8bf9>", line 1, in <module>
xrd = xrdtools.read_xrdml("filename.xrdml")

File "...XRDToolsxrdtoolsxrdtoolsio.py", line 297, in read_xrdml
valid = validate_xrdml_schema(filename)

File ...XRDToolsxrdtoolsxrdtoolsio.py", line 43, in validate_xrdml_schema
xmlschema_doc = etree.parse(f)

File "srclxmletree.pyx", line 3444, in lxml.etree.parse (srclxmletree.c:83171)

File "srclxmlparser.pxi", line 1855, in lxml.etree._parseDocument (srclxmletree.c:121011)

File "srclxmlparser.pxi", line 1875, in lxml.etree._parseFilelikeDocument (srclxmletree.c:121294)

File "srclxmlparser.pxi", line 1770, in lxml.etree._parseDocFromFilelike (srclxmletree.c:120078)

File "srclxmlparser.pxi", line 1185, in lxml.etree._BaseParser._parseDocFromFilelike (srclxmletree.c:114806)

File "srclxmlparser.pxi", line 598, in lxml.etree._ParserContext._handleParseResultDoc (srclxmletree.c:107724)

File "srclxmlparser.pxi", line 709, in lxml.etree._handleParseResult (srclxmletree.c:109433)

File "srclxmlparser.pxi", line 638, in lxml.etree._raiseParseError (srclxmletree.c:108287)

File "...XRDToolsxrdtoolsxrdtoolsdataschemasXRDMeasurement15.xsd", line 1
<?xml version="1.0" encoding="utf-8"?>
^
XMLSyntaxError: Start tag expected, "<" not found, line 1, column 1

Etwas näher betrachten io.py, da ist diese Funktion:

def validate_xrdml_schema(filename):
"""Validate the xml schema of a given file.

Parameters
----------
filename : str
The Filename of the `.xrdml` file to test.

Returns
-------
float or None
Returns the version number as float or None if
the file was not matching any provided xml schema.

"""
schemas = [(1.5, "data/schemas/XRDMeasurement15.xsd"),
(1.4, "data/schemas/XRDMeasurement14.xsd"),
(1.3, "data/schemas/XRDMeasurement13.xsd"),
(1.2, "data/schemas/XRDMeasurement12.xsd"),
(1.1, "data/schemas/XRDMeasurement11.xsd"),
(1.0, "data/schemas/XRDMeasurement10.xsd"),
]
schemas = [(v, os.path.join(package_path, schema)) for v, schema in schemas]

with open(filename, "r") as f:
data_xml = etree.parse(f)

for version, schema in schemas:
with open(schema, "r") as f:
xmlschema_doc = etree.parse(f)
xmlschema = etree.XMLSchema(xmlschema_doc)

valid = xmlschema.validate(data_xml)
if valid:
return version
return None

Nach dem, was ich gelesen habe, xmlschema_doc = etree.parse(f) verursacht die Probleme. Wenn ich diese Zeile zu ändern etree.parse(filename)Es läuft ohne Fehler, aber ich bin mir nicht sicher, ob das überhaupt zählt. Ich war auch nicht in der Lage, diesen Fix auf etwas anderes als eine kleine in sich abgeschlossene Zelle in einem Jupyter-Notebook anzuwenden.

Was verursacht den Fehler? Gibt es eine Möglichkeit, es für Python 3 zu beheben? Was ist der beste Weg, dieses Update zu implementieren?

Würde mich freuen, das gelöst zu bekommen. TIA!

Das meiste verwandte Problem könnte ich finden: Python 3.4 lxml.etree: Start-Tag erwartet, '<' nicht gefunden, Zeile 1, Spalte 1

Antworten:

0 für die Antwort № 1

Versuchen:

with io.open(filename, "r", encoding="utf8") as f:
data_xml = etree.parse(f)

(io.open denn es ist der gleiche Aufruf sowohl für Python 2 und Python 3).