如果 Go 中有相应的 xml 命名空间,为什么 Xsd 解析特定属性失败?
Why Xsd parsing is failing for specific attribute, if there is a corresponding xml namespace available in Go?
我正在尝试通过 golang 解析生成的 xsd。为了使这个用例非常简单,xsd 模式仅包含一个枚举(简单类型)。
示例代码
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)
}
}
}
以上程序的输出是Go Play link replicating the issue
[0] = []
[1] = []
[2] = []
[3] = []
无法解析作为 xsd 的一部分可用的 codegen:cname 标签。
如果我手动删除以下 xml 命名空间
xmlns:codegen="http://schemas.web.com/MYSVC"
然后我得到预期的输出如下 Go Play link after removing codegen namespace
[0] = [ENUM_0]
[1] = [ENUM_1]
[2] = [ENUM_2]
[3] = [ENUM_3]
在理解在 go 中解析命名空间时使用和不使用命名空间的行为差异时需要帮助吗?。有什么方法可以在不修改我正在解析的原始 xsd 文件的情况下获取 EnumStrings ENUM_0...3 吗?
提前致谢
命名空间是http://schemas.web.com/MYSVC
,codegen
是命名空间的别名,一旦解析XML就丢失了:
EnumString string `xml:"http://schemas.web.com/MYSVC cname,attr"`
我正在尝试通过 golang 解析生成的 xsd。为了使这个用例非常简单,xsd 模式仅包含一个枚举(简单类型)。
示例代码
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)
}
}
}
以上程序的输出是Go Play link replicating the issue
[0] = []
[1] = []
[2] = []
[3] = []
无法解析作为 xsd 的一部分可用的 codegen:cname 标签。 如果我手动删除以下 xml 命名空间
xmlns:codegen="http://schemas.web.com/MYSVC"
然后我得到预期的输出如下 Go Play link after removing codegen namespace
[0] = [ENUM_0]
[1] = [ENUM_1]
[2] = [ENUM_2]
[3] = [ENUM_3]
在理解在 go 中解析命名空间时使用和不使用命名空间的行为差异时需要帮助吗?。有什么方法可以在不修改我正在解析的原始 xsd 文件的情况下获取 EnumStrings ENUM_0...3 吗?
提前致谢
命名空间是http://schemas.web.com/MYSVC
,codegen
是命名空间的别名,一旦解析XML就丢失了:
EnumString string `xml:"http://schemas.web.com/MYSVC cname,attr"`