首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析Go中的多个XML标记

解析Go中的多个XML标记
EN

Stack Overflow用户
提问于 2015-10-20 07:49:49
回答 1查看 578关注 0票数 0

我正试图解析sslscan的xml文件,该文件具有以下输出(缩写)。我想用Go解析它。

代码语言:javascript
复制
<document title="SSLScan Results">
 <ssltest host="x.x.x.x" port="443">
   <cipher status="accepted" sslversion="TLSv1.0" bits="256" cipher="DHE-RSA-CAMELLIA256-SHA" dhebits="2048" />
             .
             .
   <cipher status="accepted" sslversion="TLSv1.2" bits="112" cipher="DES-CBC3-SHA" />               .

  <certificate>
   <not-valid-before>Jun  6 00:00:00 2014 GMT</not-valid-before>
   <not-valid-after>Jul  4 23:59:59 2017 GMT</not-valid-after>
  </certificate>
 </ssltest>
</document>

代码:

代码语言:javascript
复制
type XMLStrap struct {
  Status     string `xml:"status,attr"`
  SSLversion string `xml:"sslversion,attr"`
  Bits       string `xml:"bits,attr"`
  Cipher     string `xml:"cipher,attr"`
}

type XMLStraps struct {
  XMLName xml.Name   `xml:"document"`
  Straps  []XMLStrap `xml:"ssltest>cipher"`
}

func ReadStraps(reader io.Reader) ([]XMLStrap, error) {
  var xmlStraps XMLStraps
  if err := xml.NewDecoder(reader).Decode(&xmlStraps); err != nil {
    return nil, err
  }
  return xmlStraps.Straps, nil
}


func main() {
  strapsFilePath, err := filepath.Abs("straps.xml")
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }

  file, err := os.Open(strapsFilePath)
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }

  defer file.Close()

  xmlStraps, err := ReadStraps(file)
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }

  for i := 0; i < len(xmlStraps); i++ {
    fmt.Printf("%s %s %s %s\n", xmlStraps[i].Status,      xmlStraps[i].SSLversion, xmlStraps[i].Bits, xmlStraps[i].Cipher)
  }
}

一切正常,但我不知道如何在不创建新阅读器的情况下解析<certificate><not-valid-before>中的日期。

我试图将前两个结构体更改为

代码语言:javascript
复制
type XMLStrap struct {
  Status     string `xml:"cipher>status,attr"`
  SSLversion string `xml:"cipher>sslversion,attr"`
  Bits       string `xml:"cipher>bits,attr"`
  Cipher     string `xml:"cipher>cipher,attr"`
  Cert       string `xml:"certificate>not-valid-after,chardata"`
}

type XMLStraps struct {
  XMLName xml.Name   `xml:"document"`
  Straps  []XMLStrap `xml:"ssltest"`
}

但这不管用。

xml: cipher>status chain not valid with attr flag exit status 1

显然,在较早版本的围棋中,它起了作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-20 08:41:38

我必须将一个新对象的参数分配给返回的对象。我以前试过这个,但我犯了个错误

代码语言:javascript
复制
type XMLStrap struct {
  Status     string `xml:"status,attr"`
  SSLversion string `xml:"sslversion,attr"`
  Bits       string `xml:"bits,attr"`
  Cipher     string `xml:"cipher,attr"`
  Valid      string ""
}

type Certs struct {
  Cert string `xml:"not-valid-after"`
}

type XMLStraps struct {
  XMLName    xml.Name   `xml:"document"`
  Straps     []XMLStrap `xml:"ssltest>cipher"`
  Validation Certs      `xml:"ssltest>certificate"`
}

func ReadStraps(reader io.Reader) ([]XMLStrap, error) {
  var xmlStraps XMLStraps
  if err := xml.NewDecoder(reader).Decode(&xmlStraps); err != nil {
    return nil, err
  }
  xmlStraps.Straps[0].Valid = xmlStraps.Validation.Cert
  return xmlStraps.Straps, nil
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33230936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档