diff --git a/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/walker/XmlSchemaScope.java b/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/walker/XmlSchemaScope.java index 475f5aab..7e2c7449 100644 --- a/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/walker/XmlSchemaScope.java +++ b/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/walker/XmlSchemaScope.java @@ -352,7 +352,15 @@ private void walk(boolean isMixed, XmlSchemaContent content) { } else { XmlSchemaSequence seq = new XmlSchemaSequence(); seq.getItems().add((XmlSchemaSequenceMember)baseParticle); - seq.getItems().add((XmlSchemaSequenceMember)ext.getParticle()); + // we cannot cast a SchemaAll instance to SequenceMember + if (ext.getParticle() instanceof XmlSchemaAll) { + XmlSchemaAll all = (XmlSchemaAll) ext.getParticle(); + for (XmlSchemaAllMember allMember : all.getItems()) { + seq.getItems().add((XmlSchemaSequenceMember) allMember); + } + } else { + seq.getItems().add((XmlSchemaSequenceMember) ext.getParticle()); + } child = seq; } diff --git a/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/walker/XmlSchemaWalker.java b/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/walker/XmlSchemaWalker.java index 4c978502..4b8e6e31 100644 --- a/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/walker/XmlSchemaWalker.java +++ b/xmlschema-walker/src/main/java/org/apache/ws/commons/schema/walker/XmlSchemaWalker.java @@ -210,13 +210,7 @@ public void walk(XmlSchemaElement element) { element.setMaxOccurs(XmlSchemaParticle.DEFAULT_MAX_OCCURS); } - XmlSchemaType schemaType = element.getSchemaType(); - if (schemaType == null) { - final QName typeQName = element.getSchemaTypeName(); - if (typeQName != null) { - schemaType = schemasByNamespace.getTypeByName(typeQName); - } - } + XmlSchemaType schemaType = getSchemaTypeOfElement(element); if (schemaType != null) { XmlSchemaScope scope = null; @@ -582,4 +576,21 @@ private static QName getElementQName(XmlSchemaElement element) { return element.getQName(); } } + + + private XmlSchemaType getSchemaTypeOfElement(XmlSchemaElement element) { + XmlSchemaType schemaType = element.getSchemaType(); + if (schemaType == null) { + final QName typeQName = element.getSchemaTypeName(); + if (typeQName != null) { + schemaType = schemasByNamespace.getTypeByName(typeQName); + } else { + final QName substitutionGroupQName = element.getSubstitutionGroup(); + if (substitutionGroupQName != null) { + schemaType = getSchemaTypeOfElement(schemasByNamespace.getElementByName(substitutionGroupQName)); + } + } + } + return schemaType; + } }