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