From 625a650b40c6b516d99e2e4753caf2295bed8315 Mon Sep 17 00:00:00 2001 From: Christodoulos Tsoulloftas Date: Sun, 20 Aug 2023 18:37:49 +0300 Subject: [PATCH] Ignore xsi attrs when fail on unknown attributes is enabled --- .pre-commit-config.yaml | 2 +- tests/formats/dataclass/parsers/nodes/test_element.py | 9 +++++++++ xsdata/formats/dataclass/parsers/nodes/element.py | 7 ++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 728361fb5..cca18ba0c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -41,7 +41,7 @@ repos: - id: docformatter args: [ "--in-place", "--pre-summary-newline" ] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.5.0 + rev: v1.5.1 hooks: - id: mypy files: ^(xsdata/) diff --git a/tests/formats/dataclass/parsers/nodes/test_element.py b/tests/formats/dataclass/parsers/nodes/test_element.py index 878c5e7af..66cd9968f 100644 --- a/tests/formats/dataclass/parsers/nodes/test_element.py +++ b/tests/formats/dataclass/parsers/nodes/test_element.py @@ -221,6 +221,15 @@ def test_bind_with_fail_on_unknown_attributes(self): self.assertEqual("Unknown attribute ExtendedType:a", str(cm.exception)) + def test_bind_with_fail_on_unknown_attributes_ignores_xsi_attributes(self): + self.node.meta = self.context.build(ExtendedType) + self.node.config.fail_on_unknown_attributes = True + self.node.attrs = {QNames.XSI_TYPE: "b"} + + objects = [] + self.node.bind("foo", "text", "tail", objects) + self.assertEqual(1, len(objects)) + @mock.patch("xsdata.formats.dataclass.parsers.nodes.element.logger.warning") def test_bind_objects(self, mock_warning): self.node.meta = self.context.build(TypeC) diff --git a/xsdata/formats/dataclass/parsers/nodes/element.py b/xsdata/formats/dataclass/parsers/nodes/element.py index 41bc22ae5..46bfd97a1 100644 --- a/xsdata/formats/dataclass/parsers/nodes/element.py +++ b/xsdata/formats/dataclass/parsers/nodes/element.py @@ -17,6 +17,8 @@ from xsdata.formats.dataclass.parsers.utils import PendingCollection from xsdata.logger import logger from xsdata.models.enums import DataType +from xsdata.models.enums import Namespace +from xsdata.utils.namespaces import target_uri class ElementNode(XmlNode): @@ -134,7 +136,10 @@ def bind_attrs(self, params: Dict): if var: self.bind_any_attr(params, var, qname, value) else: - if self.config.fail_on_unknown_attributes: + if ( + self.config.fail_on_unknown_attributes + and target_uri(qname) != Namespace.XSI.uri + ): raise ParserError( f"Unknown attribute {self.meta.qname}:{qname}" )