On Thu, Sep 22, 2016 at 01:03:43PM +0100, Andrii Iudin wrote: > Dear Dave, > > I am experiencing the following issue: > I try to generate the structure with an element > <xs:element name="country" type="xs:token" minOccurs="0"/> > > with a facet: > whiteSpace="collapse" > > This results in the following Python code in "buildChildren": > elif nodeName_ == 'country': > country_ = child_.text > country_ = re_.sub(String_cleanup_pat_, " ", country_).strip() > country_ = self.gds_validate_string(country_, node, 'country') > self.country = country_ > > When the element "country" is empty in the XML file that is being > processed with parseString from the generated Python module, it fails on > the regex substitution line. > > This works fine if I use "xs:string" with whiteSpace="preserve", in > which case the regex line is not generated. > > Please could you tell if this is an intended behaviour in case if > minOccurs="0" is specified?
That looks like a bug to me. Even if the XML file were not valid (for example, if minOccurs="1" and the element were missing completely), I'd prefer that the generated code parse the XML instance document OK, and leave it up to the user to use xmllint or some other validator to detect that error. It looks to me like that call to re.sub should be protected by an "if:" statement or a "try:" statement. Give me a bit of time to look at it. OK. I looked. Attached is a quick patch. This patch, in effect, assumes that it is not an error to have an element was character content is of type xs:token and the character content is empty. I'll look at this more closely, tomorrow. If you try the attached patch, please tell me what you think. Have I solved the right problem, for example? Can you think of examples for which this would not work? And, thank you for the error report. Dave > > Thank you and best regards, > Andrii > -- Dave Kuhlman http://www.davekuhlman.org
diff -r d7d1913e027f generateDS.py --- a/generateDS.py Wed Sep 14 11:27:07 2016 -0700 +++ b/generateDS.py Thu Sep 22 12:49:53 2016 -0700 @@ -3590,8 +3590,11 @@ else: wrt(" %s_ = child_.text\n" % name) if childType == TokenType: - wrt(' %s_ = re_.sub(' + wrt(' if %s_:\n' % (name, )) + wrt(' %s_ = re_.sub(' 'String_cleanup_pat_, " ", %s_).strip()\n' % (name, name)) + wrt(' else:\n') + wrt(' %s_ = ""\n' % (name, )) if child.isListType(): if (childType in IntegerType or childType == PositiveIntegerType or
------------------------------------------------------------------------------
_______________________________________________ generateds-users mailing list generateds-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/generateds-users