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

我正在尝试通过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 链接复制问题


[0] = []

[1] = []

[2] = []

[3] = []

它无法解析作为 xsd 的一部分提供的 codegen:cname 标记。如果我手动删除以下 xml 命名空间



侃侃无极
浏览 148回答 1
1回答

守着星空守着你

命名空间是 ,是命名空间的别名,一旦解析了 XML,该别名就会丢失:http://schemas.web.com/MYSVCcodegenEnumString&nbsp;string&nbsp;&nbsp;&nbsp;`xml:"http://schemas.web.com/MYSVC&nbsp;cname,attr"`
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go