-
Notifications
You must be signed in to change notification settings - Fork 8
_parse_tree raises ValueError for non-XsdElement children in XSD schemas #47
Description
Description
When parsing certain XSD schemas (specifically ISO 20022), the _parse_tree method in model.py raises a ValueError because it encounters a child node that is not an xmlschema.XsdElement.
The relevant code at model.py line 541:
for child in parent_node:
if type(child) is xmlschema.XsdElement:
# ... handles XsdElement children
else:
raise ValueError("unknown case; please check (child not an XsdElement)")This does not handle other valid XSD constructs that xmlschema may yield when iterating over a node's children (e.g., XsdAny, XsdGroup, or other non-element particles).
Steps to Reproduce
- Use an XSD schema for ISO 20022
- Attempt to create a
DataModelfrom this XSD:
from xml2db import DataModel
model = DataModel(
xsd_file="path/to/xsd",
)- The
ValueErroris raised during_build_model()→_parse_tree()
Error Traceback
Traceback (most recent call last):
File ".../xml2db/model.py", line 136, in __init__
self._build_model()
File ".../xml2db/model.py", line 228, in _build_model
root_table = self._parse_tree(
self.xml_schema[0] if len(self.xml_schema) == 1 else self.xml_schema
)
File ".../xml2db/model.py", line 517, in _parse_tree
child_table = self._parse_tree(child, nodes_path)
File ".../xml2db/model.py", line 541, in _parse_tree
raise ValueError("unknown case; please check (child not an XsdElement)")
ValueError: unknown case; please check (child not an XsdElement)
Workaround
Replacing the raise ValueError(...) with a warning allows the pipeline to proceed (skipping the unrecognized child):
else:
logger.warning(
f"Skipping non-XsdElement child: type={type(child).__name__}, "
f"child={child}, parent={parent_name}"
)Expected Behavior
_parse_tree should handle non-XsdElement children gracefully — either by skipping them with a warning, or by implementing proper support for the relevant XSD constructs (e.g., xs:any, xs:group, etc.).
Environment
- xml2db version: 0.12.5
- Python version: 3.14.2
- xmlschema version: 4.3.1
- OS: Windows
The XSD in question is a standard ISO 20022. These schemas are widely used and would be a valuable addition to xml2db's supported XSD features.
The fix in PR #17 (v0.12.4) addressed several XSD parsing improvements (recursive definitions, xsd:list, unbounded sequences), but this specific case of non-XsdElement children was not covered.