go-xml
go-xml copied to clipboard
Element ref not generating and linking types correctly.
I have been experimenting with go-xml to see if I can use it to interface with an existing Java server application. The existing schema used by the Java code is not generating Go code as I would expect. In have cut things down to a minimal example that exhibits the problem. I can see two issues that probably have a common cause:
c4d6128"Ensure all elements have a type" changes the code generation to use typestringinstead of structUser(orAnon1)- With or without
c4d6128applied theUserelement is generated as a type struct twice. Once as typeUserand once asAnon1. TheUliststruct referencesUserentries of typeAnon1.
If I change the User element to use a separate complexType definition then only one User struct is defined and Ulist references that as I would expect.
It seems like the element ref is not linking up the types correctly when generating the code.
Test files are attached but the key parts are (testref.xsd)
<xs:element ref="my:user" minOccurs="0" maxOccurs="unbounded">
gets generated into either (testref.go)
User []Anon1 xml:"http://example.com/public/schema/test1 user,omitempty"
or with c4d6128 applied (testref2.go)
User []string xml:"http://example.com/public/schema/test1 user,omitempty"
If I convert to a separate complexType (testtype.xsd) it generates as (testtype.go)
User []Usert xml:"http://example.com/public/schema/test1 user,omitempty"
with only a single structure (named Usert) in the code.
Test files in testdata.zip used
wsdlgen as follows.
//go:generate wsdlgen -pkg testref -r "Type$DOLLAR -> " -o testref.go testref.xsd
//go:generate wsdlgen -pkg testtype -r "Type$DOLLAR -> " -o testtype.go testtype.xsd
I am also facing similar issue with xsdgen. Not sure if it is exactly the same issue but my XSD and generated code is as below:
XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.example.org/schemas" targetNamespace="http://www.example.org/schemas" elementFormDefault="qualified">
<xsd:complexType name="ElementOneType">
<xsd:element ref="ElementTwo" minOccurs="0"/>
</xsd:complexType>
<xsd:element name="ElementOne" type="ElementOneType">
<xsd:annotation>
<xsd:documentation>ElementOne documentation.</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:complexType name="ElementTwoType">
<xsd:attribute name="elementTwoID" type="xsd:string" use="required">
<xsd:annotation>
<xsd:documentation>elementTwoID documentation.</xsd:documentation>
</xsd:annotation>
</xsd:attribute>
</xsd:complexType>
<xsd:element name="ElementTwo" type="ElementTwoType">
<xsd:annotation>
<xsd:documentation>ElementTwo documentation.</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:schema>
Generated GO code:
// Code generated by xsdgen. DO NOT EDIT.
package go_xml_test
type ElementOneType struct {
ElementTwo string `xml:"http://www.example.org/schemas ElementTwo,omitempty"`
}
type ElementTwoType struct {
ElementTwoID string `xml:"elementTwoID,attr"`
}
xsdgen is as follows.
/xsdgen -o test.go -pkg generated test.xsd
As we can see in generated code type for ElementTwo is string not struct ElementTwoType.
Is it the same issue or do we need separate issue for this?
Yes. That seems to be the same issue I am encountering.
Just convert ref attribute to name + type attributes
Before
<xsd:element ref="sns:SomeElement">
After
<xsd:element name="SomeElement" type="sns:SomeElement">