如果Go中有相应的xml名称空间,为什么特定属性的Xsd解析会失败?

如果Go中有相应的xml名称空间,为什么特定属性的Xsd解析会失败?,go,xml-parsing,Go,Xml Parsing,我试图通过golang解析生成的xsd。为了使这个用例非常简单,xsd模式只包含一个枚举(simpletype) 示例代码 package main import ( "encoding/xml" "fmt" ) var schemaStr = ` <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="

我试图通过golang解析生成的xsd。为了使这个用例非常简单,xsd模式只包含一个枚举(simpletype)

示例代码

package main

import (
    "encoding/xml"
    "fmt"
)

var schemaStr = `
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.web.com/MYSVC" xmlns:svc="http://schemas.web.com/MYSVCC" xmlns:codegen="http://schemas.web.com/MYSVC" targetNamespace="http://schemas.web.com/MYSVC" elementFormDefault="qualified">
  <xsd:simpleType name="My_Enum_e">
    <xsd:restriction base="xsd:integer">
      <xsd:enumeration value="0" codegen:cname="ENUM_0" />
      <xsd:enumeration value="1" codegen:cname="ENUM_1" />
      <xsd:enumeration value="2" codegen:cname="ENUM_2" />
      <xsd:enumeration value="3" codegen:cname="ENUM_3" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:schema>`

type Schema struct {
    XMLName         xml.Name          `xml:"schema"`
    TargetNamespace string            `xml:"targetNamespace,attr"`
    Namespaces      map[string]string `xml:"-"`
    SimpleTypes     []*SimpleType     `xml:"simpleType"`
}

type SimpleType struct {
    XMLName     xml.Name     `xml:"simpleType"`
    Name        string       `xml:"name,attr"`
    Restriction *Restriction `xml:"restriction"`
}

type Restriction struct {
    XMLName xml.Name `xml:"restriction"`
    Base    string   `xml:"base,attr"`
    Enum    []*Enum  `xml:"enumeration"`
}

type Enum struct {
    XMLName    xml.Name `xml:"enumeration"`
    Value      string   `xml:"value,attr"`
    EnumString string   `xml:"codegen cname,attr"`
}

func main() {
    schema := &Schema{}
    xml.Unmarshal([]byte(schemaStr), schema)
    for _, simpleType := range schema.SimpleTypes {
        if simpleType.Restriction == nil {
            continue
        }
        for _, enumVal := range simpleType.Restriction.Enum {
            fmt.Printf("[%v] = [%v]\n", enumVal.Value, enumVal.EnumString)
        }
    }
}
它无法解析xsd中可用的codegen:cname标记。 如果我手动删除以下xml名称空间

xmlns:codegen="http://schemas.web.com/MYSVC" 
然后我得到如下所示的预期输出

在go?中解析名称空间时,需要帮助理解使用名称空间和不使用名称空间的行为差异?。是否有任何方法可以在不修改正在解析的原始xsd文件的情况下获取EnumStrings ENUM_0…3


提前感谢

名称空间是
http://schemas.web.com/MYSVC
codegen
是命名空间的别名,解析XML后会丢失:

EnumString string   `xml:"http://schemas.web.com/MYSVC cname,attr"`
[0] = [ENUM_0]
[1] = [ENUM_1]
[2] = [ENUM_2]
[3] = [ENUM_3]
EnumString string   `xml:"http://schemas.web.com/MYSVC cname,attr"`