Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 35 additions & 10 deletions src/cbexigen/SchemaAnalyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,31 @@ def __build_particle_comment(self, element: XsdElement, level):

return comment

@staticmethod
def __xsd_element_sort_key(element: XsdElement):
type_name = ''
if hasattr(element, 'type') and element.type is not None:
type_name = element.type.qualified_name or element.type.local_name or ''

return element.name or '', type_name

@classmethod
def __sorted_xsd_elements(cls, elements):
return sorted(elements, key=cls.__xsd_element_sort_key)

@classmethod
def __iter_substitutes(cls, element: XsdElement):
substitutes = element.maps.substitution_groups.get(element.name)
if not substitutes:
return

for substitute in cls.__sorted_xsd_elements(substitutes):
if not substitute.abstract:
yield substitute
for recursive_substitute in cls.__iter_substitutes(substitute):
if not recursive_substitute.abstract:
yield recursive_substitute

@staticmethod
def __get_child_count(element: [XsdElement, XMLSchema11]):
count = 0
Expand All @@ -223,19 +248,19 @@ def __get_child_count(element: [XsdElement, XMLSchema11]):

return count

@staticmethod
def __get_substitute_count(element: [XsdElement, XMLSchema11]):
@classmethod
def __get_substitute_count(cls, element: [XsdElement, XMLSchema11]):
count = 0
for _ in element.iter_substitutes():
for _ in cls.__iter_substitutes(element):
count += 1

return count

@staticmethod
def __get_substitute_list(element: [XsdElement]):
@classmethod
def __get_substitute_list(cls, element: [XsdElement]):
substitute_list = ""

for substitute in element.iter_substitutes():
for substitute in cls.__iter_substitutes(element):
if substitute.name is None:
continue

Expand Down Expand Up @@ -574,7 +599,7 @@ def __get_particle_list(self, element: XsdElement, subst_list):
qname = self.__get_name(child)
subst_group = self.__current_schema.substitution_groups._target_dict.get(qname)
if subst_group:
for elem in subst_group:
for elem in self.__sorted_xsd_elements(subst_group):
particle = self.__get_abstract_particle(child, elem)
particles.append(particle)
subst_list.append(elem)
Expand All @@ -592,7 +617,7 @@ def __get_particle_list(self, element: XsdElement, subst_list):
qname = self.__get_name(element)
subst_group = self.__current_schema.substitution_groups._target_dict.get(qname)
if subst_group:
for elem in subst_group:
for elem in self.__sorted_xsd_elements(subst_group):
particle = self.__get_abstract_particle(element, elem)
particles.append(particle)
subst_list.append(elem)
Expand Down Expand Up @@ -852,7 +877,7 @@ def __get_child_tree(self, element: XsdElement, level, recursive=True):
qname = self.__get_name(child)
sg = self.__current_schema.substitution_groups._target_dict.get(qname)
if sg:
for substitute in sg:
for substitute in self.__sorted_xsd_elements(sg):
substitute_type_name = self.__get_type_name(substitute)
msg_write(level * " " + str(level) + "." + str(count) + " " +
substitute.name + " -> " + substitute_type_name)
Expand Down Expand Up @@ -1049,7 +1074,7 @@ def __print_child_recursive(element_list, child_element: XsdElement):
if child_element.name not in element_list.keys():
element_list[child_element.name] = __get_fragment(child_element)

for subst_child in child_element.iter_substitutes():
for subst_child in self.__iter_substitutes(child_element):
__print_child_recursive(element_list, subst_child)

for sub_child in child_element.iterchildren():
Expand Down