Paul,

I believe that I've been able to fix several problems.  Now, from
the AIXM schema, we can generate a module that parses the data file
that you provided (`COCESNA_20170516_sample.xml`) without throwing
an exception.

FYI, there is some fairly complicated stuff in the AIXM schema in
the way of its use of `substitutionGroup`, in particular, a number
of substitution groups that were each defined in terms of other
substitution groups and so on.

The XML file that it exports can be read successfully with Lxml.
However, there are validation errors when I apply xmllint, for
example using the following:

    xmllint --noout --schema 
Schema/AIXM_5.1/AIXM/xsd/message/AIXM_BasicMessage.xsd tmp04.xml

So, there are still things that need work.  The one issue that I've
noticed so far is that, when we parse and then export an XML
document, at least one needed namespace prefix definition is
missing.  I'll check into that.

OK.  After a little checking and a few trial runs.  I can fix
several of the export problems by hard-wiring namespace prefixes and
namespace definitions into the call to the `export` method in the
`parse` function.  That's not optimal, but at least it seems
usable.

However, now when I apply `xmllint` to this newly exported document,
I still get several validation errors.  It's better, but still not
entirely problem free yet.  I don't know whether those remaining
problems would be issues for your work.

I'll do some more checking.

I've pushed these changes to Bitbucket.  When/if you want try it,
you can find the latest here:
https://dkuhl...@bitbucket.org/dkuhlman/generateds

And, here is my modified version of the `parse` method in the
generated module.  As you can see, it adds a namespace prefix and
namespace definitions to the call to `export`:

    def parse(inFileName, silence=False):
        parser = None
        doc = parsexml_(inFileName, parser)
        rootNode = doc.getroot()
        rootTag, rootClass = get_root_tag(rootNode)
        if rootClass is None:
            rootTag = 'AIXMBasicMessageType'
            rootClass = AIXMBasicMessageType
        rootObj = rootClass.factory()
        rootObj.build(rootNode)
        # Enable Python to collect the space used by the DOM.
        doc = None
        if not silence:
            sys.stdout.write('<?xml version="1.0" ?>\n')
            rootObj.export(
                sys.stdout, 0, name_=rootTag,
                namespaceprefix_='message:',
                
namespacedef_='xmlns:message="http://www.aixm.aero/schema/5.1/message"; 
xmlns:gml="http://www.opengis.net/gml/3.2"; 
xmlns:aixm="http://www.aixm.aero/schema/5.1";',
                pretty_print=True)
        return rootObj

More later.  But, I'm going on a trip for a week.  I got this idea
that I've got to see eastern Texas.  So, I'll try to go back to work
on this when I get back.

Dave

On Thu, May 02, 2019 at 10:13:43AM -0400, Paul Vajda wrote:
> Dave,
> 
> Thank you for the quick reply.  Your explanation of dateTime demystifies 
> generates’ behavior.  Let me know if there is anything else I can do to help. 
>  Glad to see the development of this awesome tool is still alive and kicking!
> 
> -Paul
> 
> > On May 1, 2019, at 8:11 PM, Dave Kuhlman <dkuhl...@davekuhlman.org> wrote:
> > 
> > Paul,
> > 
> > Here are a few comments.
> > 
> > First, unfortunately, this schema has complexities that `generateDS`
> > does not handle.
> > 
> > About `dateTime` -- `xs:dateTime` is a simple, built-in type.
> > Simple means that it's something like a string, float, or integer,
> > and that it has no parts or elements in it.  Built-in means that it
> > is predefined in the XML Schema specification, and the schema does
> > not have to define it with `xs:simpleType`.  (see
> > https://www.w3.org/TR/xmlschema-0/#SimpleTypeFacets 
> > <https://www.w3.org/TR/xmlschema-0/#SimpleTypeFacets>)  `generateDS`
> > knows this, but for some reason, it believes that particular
> > reference to a `dateTime` is an `xs:complexType` for which there is
> > a generated Python class, and so it is trying to create an instance
> > of that class.  That's wrong.  The specific field, `origin`, is
> > defined as containing a `gml:TimeInstantPropertyType`, and it
> > should, I believe, be creating an instance of that class.  I'll try
> > to track this down.  Thanks for pointing me at that sample XML data
> > file; I've been able to reproduce this exception.
> > 
> > With respect to the other bug you describe:
> > 
> >    AttributeError: 'CurveSegmentArrayPropertyType' object has no
> >    attribute ‘ArcByCenterPoint'
> > 
> > I have not yet been able to figure much out about this one.  I need
> > to fix the `dateTime` issue so that I can debug this one.  Then I'll
> > work on figuring out what a `CurveSegmentArrayPropertyType` *should*
> > contain.
> > 
> > By the way, the issue about defining the same name in multiple
> > namespaces has changed.  I've added code to deal with that problem.
> > However, that added feature is new and was added only a couple of
> > weeks ago.  So, it is possible that there are bugs and corner cases
> > related to it that have not yet been shaken out.
> > 
> > I'll report back when and if I've been able to fix some of the
> > above.  But, that might not be real soon.  We'll see.  I apologize
> > for the bad news.
> > 
> > And, thank you for your detailed report.  That has been and will be
> > very helpful as I try to track down and fix these issues.
> > 
> > Dave
> > 
> > On Tue, Apr 30, 2019 at 04:34:51PM -0400, Paul Vajda wrote:
> >> Hello,
> >> 
> >> I recently found your generateDS python tool to convert XML Schema
> >> into python data structures and was hoping you could lend me a
> >> hand.  I found the SourceForge page but form the looks of it it
> >> seems the support threads have not been active in a few years, so
> >> I thought I might send you the question directly to make sure you
> >> saw it.  I apologize in advance and would gladly post in the
> >> forums so we could discuss there if you’d prefer.
> >> 
> >> After two days of banging my head against the wall, here is where
> >> I am at...
> >> 
> >> I’m attempting to generate a python data structure using the AIXM
> >> XML Schema, found here (under AIXM Data - first link AIXM 5.1):
> >> https://www.faa.gov/air_traffic/flight_info/aeronav/aero_data/NASR_Subscription_2019-04-25/
> >> <https://www.faa.gov/air_traffic/flight_info/aeronav/aero_data/NASR_Subscription_2019-04-25/
> >>  
> >> <https://www.faa.gov/air_traffic/flight_info/aeronav/aero_data/NASR_Subscription_2019-04-25/>>
> >> 
> >> That directory contains the following:
> >> ISO_19136_Schemas (directory)
> >> ISO_19139_Schemas (directory)
> >> message (directory)
> >> xlink (directory)
> >> AIXM_Features.xsd
> >> AIXM_DataTypes.xsd
> >> AIXM_AbstractGML_ObjectTypes.xsd
> >> 
> >> By comparing with AIXM compliant XML documents, I figured out that
> >> /message/AIXM_BasicMessage.xsd had to the schema used in the
> >> command line to obtain a complete data structure.  In other words,
> >> AIXM_BasicMessage.xsd contains references to AIXM_Features,
> >> DataTypes and so forth, witch in turn contain references to
> >> schemas contained in the ISO_19136_Schemas directory.
> >> 
> >> I first tried a simple command in my terminal window:
> >> 
> >> ../../.././bin/python3 generateDS.py -o testingAIXM.py -s
> >> testingAIXMsubs.py
> >> ../aixmschemaTEST4/message/AIXM_BasicMessage.xsd
> >> 
> >> And terminal output:
> >> 
> >> *** warning.  Removing child with duplicate name: "Boolean"
> >> *** warning.  Removing child with duplicate name: "AbstractObject"
> >> *** warning.  Removing child with duplicate name: "Curve"
> >> *** warning.  Removing child with duplicate name: "Point"
> >> *** warning.  Removing child with duplicate name: "Surface” 
> >> 
> >> And that’s it, it seems everything worked.
> >> 
> >> I then tried to validate the DS by parsing the following:
> >> https://ext.eurocontrol.int/aixm_confluence/display/AIX/AIXM+5.1+-+sample+data+files
> >> <https://ext.eurocontrol.int/aixm_confluence/display/AIX/AIXM+5.1+-+sample+data+files
> >>  
> >> <https://ext.eurocontrol.int/aixm_confluence/display/AIX/AIXM+5.1+-+sample+data+files>>
> >> : COCESNA_20170516_sample.xml
> >> 
> >> However, when I attempt to parse using the parse function, I got an error:
> >> 
> >>    obj_ = dateTime.factory(parent_object_=self) 
> >> NameError: name 'dateTime' is not defined
> >> 
> >> Upon closer inspection, and retracing the terminal output, I found
> >> that at line 193311 of testingAIXM.py:
> >> 
> >> elif nodeName_ == 'origin':
> >>            obj_ = dateTime.factory(parent_object_=self)
> >>            obj_.build(child_)
> >>            self.origin = obj_
> >>            obj_.original_tagname_ = ‘origin'
> >> 
> >> Indeed, searching the generated python document by generateDS, I
> >> could not find one instance where dateTime is defined. (! so I got
> >> pretty confused)
> >> 
> >> Question: why do certain classes contain references to a dateTime
> >> class when it was never defined?
> >> 
> >> So I compared the class that that snipped of code was located in
> >> with the XML Schema, and found that ‘origin’, in the schema, had
> >> as type CodeFlightOriginType.  That type is defined in
> >> testingAIXM.py, so I replaced dateTime with CodeFlightOriginType.
> >> 
> >> Doing that successfully sidestepped the error, but led to a new
> >> one:
> >> 
> >> AttributeError: 'CurveSegmentArrayPropertyType' object has no
> >> attribute ‘ArcByCenterPoint'
> >> 
> >> This error brought me back to your documentation on prefix
> >> mismatch.  The schemas I’m trying to ‘pythonize’ have several
> >> namespace prefixes.  I did find a support thread
> >> https://sourceforge.net/p/generateds/mailman/message/24027239/
> >> <https://sourceforge.net/p/generateds/mailman/message/24027239/ 
> >> <https://sourceforge.net/p/generateds/mailman/message/24027239/>>
> >> posted back in 2009.  
> >> 
> >> However, I have a feeling that both the errors I described above
> >> are two separate things, and simply manually swapping a line of
> >> code for another does not actually fix anything..
> >> 
> >> Questions:
> >> 
> >> In response to Erica’s question (2009), you did mention that
> >> generateDS only supported one namespace prefix.  Since 2009, has
> >> that changed?  I tried defining multiple namespace prefixes using
> >> the -a flag but that didn’t work.  I also tried re-running my
> >> terminal command with only one namespace prefix: -a “aixm:” but
> >> that did not change the output testingAIXM.py What actually does
> >> specifying the namespace prefix do?  After searching a bit I found
> >> that in ISO_19136_Schemas/geometryPrimitives.xsd,
> >> CurveSegmentArrayPropertyType does refer to ArcByCenterPoint.
> >> (http://www.datypic.com/sc/niem21/t-gml32_CurveSegmentArrayPropertyType.html
> >> <http://www.datypic.com/sc/niem21/t-gml32_CurveSegmentArrayPropertyType.html
> >>  
> >> <http://www.datypic.com/sc/niem21/t-gml32_CurveSegmentArrayPropertyType.html>>)
> >> Do you have any recommendations of actions I could try on my end
> >> to debug this?
> >> 
> >> I greatly appreciate your help and look forward to hearing back,
> >> 
> >> Thank you,
> >> 
> >> -Paul
> >> 
> > 
> > -- 
> > 
> > Dave Kuhlman
> > http://www.davekuhlman.org <http://www.davekuhlman.org/>

-- 

Dave Kuhlman
http://www.davekuhlman.org


_______________________________________________
generateds-users mailing list
generateds-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/generateds-users

Reply via email to