我正试图解析sslscan的xml文件,该文件具有以下输出(缩写)。我想用Go解析它。
<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>代码:
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>中的日期。
我试图将前两个结构体更改为
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
显然,在较早版本的围棋中,它起了作用。
发布于 2015-10-20 08:41:38
我必须将一个新对象的参数分配给返回的对象。我以前试过这个,但我犯了个错误
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
}https://stackoverflow.com/questions/33230936
复制相似问题