diff --git a/src/freshdata/parsers/gpx.py b/src/freshdata/parsers/gpx.py
index 8c758258..355035fc 100644
--- a/src/freshdata/parsers/gpx.py
+++ b/src/freshdata/parsers/gpx.py
@@ -41,7 +41,7 @@ def parse(self, source: Any) -> ParseResult:
except ValueError as exc:
return ParseResult(self.format, {v: pd.DataFrame() for v in _POINT_KIND.values()},
self.suggested_domain, {}, [f"unsafe GPX XML: {exc}"])
- except ET.ParseError as exc:
+ except (ET.ParseError, LookupError) as exc:
return ParseResult(self.format, {v: pd.DataFrame() for v in _POINT_KIND.values()},
self.suggested_domain, {}, [f"invalid GPX XML: {exc}"])
finally:
diff --git a/src/freshdata/parsers/sdmx.py b/src/freshdata/parsers/sdmx.py
index 025f1a2a..d34cd7ad 100644
--- a/src/freshdata/parsers/sdmx.py
+++ b/src/freshdata/parsers/sdmx.py
@@ -40,7 +40,7 @@ def parse(self, source: Any) -> ParseResult:
except ValueError as exc:
return ParseResult(self.format, {"observations": pd.DataFrame()},
None, {}, [f"unsafe SDMX XML: {exc} (audit only)"])
- except ET.ParseError as exc:
+ except (ET.ParseError, LookupError) as exc:
return ParseResult(self.format, {"observations": pd.DataFrame()},
None, {}, [f"invalid SDMX XML: {exc} (audit only)"])
finally:
diff --git a/tests/parsers/test_gpx.py b/tests/parsers/test_gpx.py
index 9005b3d2..4c8e6df7 100644
--- a/tests/parsers/test_gpx.py
+++ b/tests/parsers/test_gpx.py
@@ -60,6 +60,16 @@ def test_malformed_xml_returns_warning_not_exception():
assert any("invalid GPX XML" in w for w in result.warnings)
+def test_unknown_xml_encoding_returns_warning_not_exception():
+ bad = (
+ ''
+ ''
+ )
+ result = fd.parse_domain(bad, format="gpx")
+ assert all(df.empty for df in result.frames.values())
+ assert any("invalid GPX XML" in w for w in result.warnings)
+
+
def test_doctype_entities_are_rejected():
entity_gpx = """]>
diff --git a/tests/parsers/test_sdmx.py b/tests/parsers/test_sdmx.py
index ba13facb..f0d9c4b9 100644
--- a/tests/parsers/test_sdmx.py
+++ b/tests/parsers/test_sdmx.py
@@ -58,6 +58,16 @@ def test_invalid_xml_is_audit_only():
assert any("invalid SDMX XML" in w and "audit only" in w for w in result.warnings)
+def test_unknown_xml_encoding_is_audit_only():
+ bad = (
+ ''
+ ""
+ )
+ result = fd.parse_domain(bad, format="sdmx")
+ assert result.frames["observations"].empty
+ assert any("invalid SDMX XML" in w and "audit only" in w for w in result.warnings)
+
+
def test_doctype_entities_are_rejected():
entity_sdmx = """]>