Bernd,

I'll be away from my machines for a couple of days, so I'll look at
this more on Monday.  Thank you for your notes and explanation.

Dave

On Wed, Aug 22, 2018 at 02:04:35PM +0000, Zimmermann, Bernd wrote:
> Hello Dave,
> 
> thank you for your hints with the explicit parameter, but this is not the 
> real problem.
> The parameter_ is only useful if you want to change the order of the 
> parameters.
> 
> Let me show you a few more examples:
> 
> OUTPUT with testxml.export(output, 0, name_='retainedDataMessageX', 
> namespace_='urks="http://uri.etsi.org/02657/v1.18.1#/RetainedData";'
> gives:
> <urks="http://uri.etsi.org/02657/v1.18.1#/RetainedData"retainedDataMessageX>
> 
> (Note that in this example I give no namespacedef_ not a default value voa 
> GenerateDSNamespaceDefs.
> 
> As you can see: name_ is printed after the namespace_ Parameter because:
> 
>        outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' + 
> namespacedef_ or '', ))
> 
> here the namespace_ is the first argument, but it should name_
> 
> So I suggest to write out only 2 parameters here:
> 
>        outfile.write('<%s%s' % (name_, namespaceOut_'', ))
> 
> an write a logic strategy before the write to set namespaceOut_ to:
> 
> 1. namespace_ if given
> 2. namespaceDef_ if given and namespace_ is not given
> 
> So I suggest a change here, for example:
>         imported_ns_def_ = GenerateDSNamespaceDefs_.get('RetainedDataMessage')
>         if imported_ns_def_ is not None:
>             namespaceOut_ = imported_ns_def_
>         if namespace_ is not None:
>             namespaceOut_ = namespace_
> 
> In the last if perhaps one can test if namespace is '' too, if given via 
> cmdline but might by ignored.
> 
> Can you guess what I am suggesting?
> 
> The correction of the documentation is useful, but is not the solver for the 
> above
> problem 😉 - I already set it the right way ...
> 
> GenerateDSNamespaceDefs = {
>     "RetainedDataMessage": 
> 'xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData";',
> }
> 
> Best regards,
> Bernd
> 
> -----Ursprüngliche Nachricht-----
> Von: Dave Kuhlman <dkuhl...@davekuhlman.org> 
> Gesendet: Freitag, 10. August 2018 22:26
> An: Zimmermann, Bernd <bernd.zimmerm...@qsc.de>
> Cc: generateds-users <generateds-users@lists.sourceforge.net>
> Betreff: Re: [Generateds-users] validate_XXX_patterns generated wrong from 
> XSD and Problems with export and namspaces
> 
> Bernd,
> 
> Thank you for your notes on this issue.
> 
> I'm still trying to think this one through.  I'm still a bit confused about 
> it.
> 
> However, here is one item that may help.  The `namespace_` parameter is 
> mis-named I suppose; its value should be a namespace prefix and a colon.  
> That value should be something like this: "abc:".  
> 
> If you were to pass something like "xyz:" as the value of the `namespace_` 
> parameter, would that fix one of your issues?
> 
> By the way: I believe that the documentation included near the top of a 
> generated module, is not correct.  It incorrectly reads:
> 
> # A sample table is:
> #
> #     # File: generatedsnamespaces.py
> #
> #     GenerateDSNamespaceDefs = {
> #         "ElementtypeA": "http://www.xxx.com/namespaceA";,
> #         "ElementtypeB": "http://www.xxx.com/namespaceB";,
> #     }
> 
> whereas, it should be:
> 
> # A sample table is:
> #
> #     # File: generatedsnamespaces.py
> #
> #     GenerateDSNamespaceDefs = {
> #         "ElementtypeA": 'xmlns:nsa="http://www.xxx.com/namespaceA";',
> #         "ElementtypeB": 'xmlns:nsb="http://www.xxx.com/namespaceB";',
> #     }
> 
> With respect to your issue 2:
> 
> > 2.)
> > OUTPUT with testxml.export(output, 0, 
> > 'xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData";')
> > results in:
> > <xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData"RetainedDataMe
> > ssage xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData";>
> > </xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData"RetainedDataM
> > essage>
> > 
> > This is not correct.
> 
> I believe that the namespace definition that you are passing in as the 2nd 
> parameter is getting attached to the namespace_ parameter, whereas you 
> actually want to set the namespacedef_ parameter.  You might consider using a 
> keyword argument to make this explicit.
> Example:
> 
>     testxml.export(
>         output,
>         0,
>         
> namespacedef_='xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData";'
>     )
> 
> While trying to straighten my head out on this, I wrote up the following 
> notes on the parameters to the `export` methods.
> 
> Arguments to the generated export method:
> 
> - outfile -- A file like object open for writing.
> 
> - level -- the indentation level.  If the pretty_print argument is
>   True, the (generated) function showIndent is used to prefix each
>   exported line with 4 spaces for each level of indent.
> 
> - namespace_ -- An empty string or an XML namespace prefix plus a
>   colon, example "abc:".  This value is printed immediately in front
>   of the tag name.
> 
> - name_ -- The element tag name.  Note that the tag name can be
>   overridden by the original_tagname_, which can be set by the class
>   constructor.
> 
> - namespacedef_ -- Zero or more namespace prefix definitions.
>   Actually, its value can be any attribute-value pairs.
>   Examples:
> 
>       ''
>       'xmlns:abc="http://www.abc.com"http://www.def.com";
>       'xmlns:abc="http://www.abc.com xmlns:def="http://www.def.com";
> 
>   or, because it is printed where the attributes occur, even:
> 
>       'size="25" color="blue"'
> 
>   For more on namespacedef_, see:
>       
> http://www.davekuhlman.org/generateDS.html#namespaces-inserting-namespace-definition-in-exported-documents
> 
> - pretty_print -- If True, exported output is printed with
>   indentation and newlines.  If False, indentation and newlines are
>   omitted, which produces a more compact representation.
> 
> I've added the above notes to the generateDS document.  See:
> http://www.davekuhlman.org/generateDS.html#method-export
> 
> Sigh.  XML namespaces make my head hurt.
> 
> I'll study this and your notes a bit more.  There must be *some* way we can 
> make sense of this and get it to work correctly.
> 
> Hope your weekend is (or was) a good one.
> 
> Dave
> 
> On Thu, Aug 09, 2018 at 10:14:57AM +0000, Zimmermann, Bernd wrote:
> > Hello Dave,
> > 
> > thank you very much for the patch for the validate patterns, it works 
> > 😉 so it could go productive on your next release.
> > 
> > Just a few additional remarks on the export issue:
> > 
> > Code: def export(self, outfile, level, namespace_='', 
> > name_='RetainedDataMessage', namespacedef_='', pretty_print=True):
> > There are three possible parameters: namespace_, name_, namespacedef_
> > 
> > The line: outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ 
> > and ' ' + namespacedef_ or '', )) will print:
> > <namespace_ , name_, namespacedef_> if all three values are set.
> > Note: namespacedef_ may be set via GenerateDSNamespaceDefs option.
> > 
> > Here is just a first problem, because the namespace must be a second 
> > value in the xml tag <OBJECT_NAME NAMESPACE> </OBJECT_NAME> in a valid 
> > xml, not the first.
> > 
> > TESTing:
> > 1.)
> > using: testxml.export(output, 0, '', 'retainedDataMessage') results 
> > in:
> > <retainedDataMessage 
> > xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData";>
> > ...
> > </retainedDataMessage>
> > 
> > this ist Ok.
> > Note that GenerateDSNamespaceDefs is set in my test case.
> > Parameter namespace_ is empty.
> > Parameter name_ is set
> > Parameter namespacedef_ is not used but overwritten by:
> > imported_ns_def_ = GenerateDSNamespaceDefs_.get('RetainedDataMessage')
> >         if imported_ns_def_ is not None:
> >             namespacedef_ = imported_ns_def_
> > 
> > 2.)
> > OUTPUT with testxml.export(output, 0, 
> > 'xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData";')
> > results in:
> > <xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData"RetainedDataMe
> > ssage xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData";>
> > </xmlns="http://uri.etsi.org/02657/v1.18.1#/RetainedData"RetainedDataM
> > essage>
> > 
> > This is not correct.
> > There is the problem as stated above that the namespace_ is set und 
> > printed out at first in the opening tag before the name_
> > 
> > The logical problem is: The parameter namespace_ is set (the first
> > one) and there is an GenerateDSNamespaceDefs setting, so there is a 
> > logic missing, to decide which parameter to use in the export if there 
> > are 2 possibilities.  My suggestion would be to always use 
> > namespacedef_ it set and use the value via GenerateDSNamespaceDefs 
> > setting only if namespacedef_ parameter is not used or set.
> > 
> > So for me it looks like to adjust the lines with outfile.write('< and 
> > outfile.write('> to match an valid XML form like:
> > <OBJECT_NAME NAMESPACE>
> > </OBJECT_NAME>
> > 
> > Hope you guess what I mean.
> > 
> > Best wishes,
> > Bernd
> > 
> > -----Ursprüngliche Nachricht-----
> > Von: Dave Kuhlman [mailto:dkuhl...@davekuhlman.org]
> > Gesendet: Dienstag, 24. Juli 2018 23:03
> > An: Zimmermann, Bernd <bernd.zimmerm...@qsc.de>
> > Cc: generateds-users <generateds-users@lists.sourceforge.net>
> > Betreff: Re: [Generateds-users] validate_XXX_patterns generated wrong 
> > from XSD and Problems with export and namspaces
> > 
> > Bernd,
> > 
> > With respect to the validation of time and the 
> > validate_GeneralizedTime_patterns_, I've attached a patch.  With this 
> > patch, I believe that generateDS.py produces the pattern that works for 
> > you.  These regular expressions are complicated enough, and I'm in the dark 
> > about what they should and should not be checking.  So, if this patch works 
> > for you, let's go with it.  We can make adjustments when someone else 
> > reports a problem with it.
> > 
> > Here is a little explanation, as far as I can understand it: This patch 
> > removes the code that was replacing "|" with "$|^".  That replacement was 
> > intended to enable us to handle alternatives in regular expressions by 
> > breaking them up into several concatenated expressions.  *But*, maybe the 
> > ability to handle those alternatives is (or should be) written into the 
> > regular expression itself, *if* the author of the XML schema writes them 
> > correctly.  If so, the replacement that we are removing is not needed, and 
> > this patch is the right thing to do.  At least, that's what I'm hoping.
> > 
> > About your other issue, I'll take a look tomorrow.  But, at first glance, 
> > it looks like the values you are passing in to the export method are being 
> > attached to the wrong arguments.  You are passing positional arguments.  
> > You could try using the keyword arguments:
> > 
> >     namespace_
> >     name_
> >     namespacedef_
> > 
> > You will have to look at one of the export methods to see how each of those 
> > parameters is used.
> > 
> > By the way, your suggestion in your latest email that a module generated by 
> > generateDS.py be able to do an automatic validation of the exported XML 
> > instance document seems like a good idea.  Although adding something like 
> > this line:
> > 
> >     xmllint --schema test.xsd test01.xml
> > 
> > to a batch file does seem like an easy enough way to handle that.
> > So, I'll put that feature on a "do" list, but it might not be at the very 
> > top of the list.
> > 
> > More later.  Thanks again for your help with these issues.
> > 
> > Dave
> > 
> > On Thu, Jul 19, 2018 at 12:19:52PM +0000, Zimmermann, Bernd wrote:
> > > Hello Dave,
> > > 
> > > very great stuff you've done with generateDS, works like a charm but only 
> > > after a resolving a few little things.
> > > 
> > > First on, this might be a bug:
> > > 
> > > XSD Pattern:
> > > 
> > > <xsd:simpleType name="GeneralizedTime">
> > >     <xsd:restriction base="xsd:string">
> > >         <xsd:pattern 
> > > value="\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])(.[0-9][0-9]*)?(Z|[\+|\-][0-9]{4})"/>
> > >     </xsd:restriction>
> > > </xsd:simpleType>
> > > 
> > > results in:
> > > 
> > > 
> > > validate_GeneralizedTime_patterns_ = 
> > > [['^\\d{4}(0[1-9]$|^1[012])(0[1-9]$|^[12][0-9]$|^3[01])([01][0-9]$|^
> > > 2[ 
> > > 0-3])([0-5][0-9])([0-5][0-9])(.[0-9][0-9]*)?(Z$|^[\\+$|^\\-][0-9]{4}
> > > )$
> > > ']]
> > > 
> > > which give the warning:
> > > 
> > > 
> > > /var/etsi/work/V1.18.1/Natparas2V18.py:7644: UserWarning: Value 
> > > "b'20180719123801+0200'" does not match xsd pattern
> > > restrictions: 
> > > [['^\\d{4}(0[1-9]$|^1[012])(0[1-9]$|^[12][0-9]$|^3[01])([01][0-9]$|^
> > > 2[ 
> > > 0-3])([0-5][0-9])([0-5][0-9])(.[0-9][0-9]*)?(Z$|^[\\+$|^\\-][0-9]{4}
> > > )$ ']] warnings_.warn('Value "%s" does not match xsd pattern
> > > restrictions: %s' % (value.encode('utf-8'), 
> > > self.validate_GeneralizedTime_patterns_, ))
> > > 
> > > Adjusting to:
> > > 
> > > 
> > > validate_GeneralizedTime_patterns_ =
> > > [['^\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-3])(
> > > [0 -5][0-9])([0-5][0-9])(.[0-9][0-9]*)?(Z|[\\+|\\-][0-9]{4})$']]
> > > 
> > > gives no warning.
> > > 
> > > So it might be a problem with the separator | which results in a wrong 
> > > ^|$ pattern?
> > > 
> > > 
> > > Second one, discovering a problem with:
> > > 
> > > testxml.export(sys.stdout, 0, '', 'retainedDataMessage')
> > > at:
> > > outfile.write('<%s%s%s' % (namespace_, name_, namespacedef_ and ' ' 
> > > + namespacedef_ or '', ))
> > > 
> > > This works correct, printing out <retainedDataMessage> or with a 
> > > generatednamespaces.py with GenerateDSNamespaceDefs the 
> > > <retainedDataMessage NSGIVEN>
> > > 
> > > But:
> > > 
> > > testxml.export(sys.stdout, 0, 'NSDATA', 'retainedDataMessage')
> > > 
> > > gives: <NSDATAretainedDataMessage> which is not correct, it should 
> > > be <retainedDataMessage NSDATA>, so it's printed in the wrong order and a 
> > > space is missing between the two arguments.
> > > 
> > > Perhaps a:
> > > outfile.write('<%s%s%s' % (name_, namespace_ and ' ' + namespace_ or 
> > > '', namespacedef_ and ' ' + namespacedef_ or '', ))
> > > 
> > > could fix this. Note: the closing tag must be adjusted too.
> > > 
> > > Perhaps the export could also be adjusted to overwrite the namespacedef_ 
> > > if a namespace_ is given or vice versa ...
> > > 
> > > I am using the latest version 2.29.17 installed via pip under Python
> > > 3.7
> > > 
> > > Hope you could fix it.
> > > 
> > > Again, great work!
> > > 
> > > Best regards,
> > > Bernd
> > > 
> > 
> > > --------------------------------------------------------------------
> > > --
> > > -------- Check out the vibrant tech community on one of the world's 
> > > most engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> > 
> > > _______________________________________________
> > > generateds-users mailing list
> > > generateds-users@lists.sourceforge.net
> > > https://lists.sourceforge.net/lists/listinfo/generateds-users
> > 
> > 
> > 
> > --
> > 
> > Dave Kuhlman
> > http://www.davekuhlman.org
> 
> -- 
> 
> Dave Kuhlman
> http://www.davekuhlman.org

-- 

Dave Kuhlman
http://www.davekuhlman.org

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
generateds-users mailing list
generateds-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/generateds-users

Reply via email to