droyo / go-xml

utility and code-generation libraries for XML
MIT License
299 stars 112 forks source link

Unconvertable xsd schema #104

Open Toasterson opened 4 years ago

Toasterson commented 4 years ago

Thank you very much for this hugely brilliant work.

I have a complex xsd file which triggers #86 and #96 but I can live with that as it is only one line I can insert myself. For documentation the offending line for those issues is here https://gist.github.com/Toasterson/5dd1db9c7862450c981ffd10f04d849b#file-service_bundle-xsd-L1339

However, it is also tripping somehow on the generated go code with:

service_bundle.go:3:7: expected 'IDENT', found 'struct' (and 1 more errors) in package smf

type  struct {
        Type Anon52 `xml:"type,attr"`
}
// May be one of
type Anon1 string
// May be one of constraints, values
type Anon52 string

type Any []string

func (a Any) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
        var output struct {
                ArrayType string   `xml:"http://schemas.xmlsoap.org/wsdl/ arrayType,attr"`
                Items     []string `xml:" item"`
        }
        output.Items = []string(a)
        start.Attr = append(start.Attr, xml.Attr{Name: xml.Name{"", "xmlns:ns1"}, Value: "http://www.w3.org/2001/XMLSchema"})
        output.ArrayType = "ns1:anyType[]"
        return e.EncodeElement(&output, start)
}
func (a *Any) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err error) {
        var tok xml.Token
        for tok, err = d.Token(); err == nil; tok, err = d.Token() {
                if tok, ok := tok.(xml.StartElement); ok {
                        var item string
                        if err = d.DecodeElement(&item, &tok); err == nil {
                                *a = append(*a, item)
                        }
                }
                if _, ok := tok.(xml.EndElement); ok {
                        break
                }
        }
        return err
}

type Include struct {
        Fallback Any   `xml:" fallback"`
        Parse    Parse `xml:"parse,attr,omitempty"`
        Encoding       `xml:"encoding,attr,omitempty"`
}

func (t *Include) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
        type T Include
        var overlay struct {
                *T
                Parse *Parse `xml:"parse,attr,omitempty"`
        }
        overlay.T = (*T)(t)
        overlay.Parse = (*Parse)(&overlay.T.Parse)
        return d.DecodeElement(&overlay, &start)
}

type Lang string
// May be one of xml, text
type Parse string
// May be one of default, preserve
type Space string

All required xsd files are uploaded to a public gist. https://gist.github.com/Toasterson/5dd1db9c7862450c981ffd10f04d849b the original sources are open source.

I did convert this file from a dtd file with trang

If required I can also link the original dtd file.

Would love to use your tool to generate go types, as this allows me to write proper smf manifests on illumos systems.

droyo commented 4 years ago

The error is here (note the extra space)

type  struct {
        Type Anon52 `xml:"type,attr"`
}

It seems similar to #99 . It appears to be trying to generate a complexType with an attribute named "type". There are a lot of those in the gist you provided. If I had to guess, I suspect it's this one, since there's no additional fields inside the complexType:

 <xs:element name="include_values">
   <xs:complexType>
     <xs:attribute name="type" use="required">
       <xs:simpleType>
         <xs:restriction base="xs:token">
           <xs:enumeration value="constraints"/>
           <xs:enumeration value="values"/>
         </xs:restriction>
       </xs:simpleType>
     </xs:attribute>
   </xs:complexType>
 </xs:element>

I'm not sure when I'll get a chance to look further, but could you try slimming down your xsd and see if you could pinpoint the type that causes this? Then maybe the -vvv output from xsdgen could give us a clue (warning: it prints a lot of output).

Toasterson commented 4 years ago

I managed to get a working version with the alternate wool xgen and some heavy manual editing. Its at for a reference https://git.wegmueller.it/OpenCloud/opencloud/src/branch/master/smf/service_bundle.xsd.go

I tried to minify the file and see which type generates the error and it turns out pretty much every one does...

Example:

<xs:element name="doc_link">
    <xs:complexType>
      <xs:attribute name="name" use="required"/>
      <xs:attribute name="uri" use="required"/>
    </xs:complexType>
  </xs:element>
read service_bundle-min.xsd
read xml.xsd
setting namespaces to ["http://www.w3.org/XML/1998/namespace"]
complexType doc_link: could not find type  in namespace  for attribute name

I only found -vv as option not -vvv is that still enough output?