2017-11-04 19 views
1

XMLファイルを解析して値を出力したいと考えています。この例ではXMLファイルを解析する

<alerts time="2017-09-14T15:46:00+02:00"> 
    <alert type="A" identifier="123" declaredBy="Bob" /> 
    <startedAt>20171010212210</startedAt> 
    <lastUpdate bySource="X"> 
     <updatedAt>20171010213655</updatedAt> 
     <eventConfirmation>unconfirmed</eventConfirmation> 
     <additional> 
     <data name="numberOfOccurences">1</data> 
     </additional> 
    </lastUpdate> 
    <labels> 
     <label language="FR">attaque DNS</Label> 
    </labels> 
    </alert> 
</alerts> 

私はちょうど1つのアラートを持っているが、私はより多くを持つことができます。私は2つのパッケージ

package alerts 

import "encoding/xml" 

// Alert structure 
type Alerts struct { 
    XMLName xml.Name `xml:"alerts"` 
    Time  string `xml:"time,attr"` 
    Alert []alert `xml:"alert"` 
} 

type lastUpdate struct { 
    XMLName   xml.Name `xml:"lastUpdate"` 
    BySource   string  `xml:"bySource,attr"` 
    UpdatedAt   string  `xml:"updatedAt"` 
    EventConfirmation string  `xml:"eventConfirmation"` 
    Additional  additional `xml:"additional"` 
} 

type additional struct { 
    XMLName xml.Name `xml:"additional"` 
    Data data  `xml:"data"` 
} 

type data struct { 
    XMLName   xml.Name `xml:"data"` 
    NumberOfOccurences int  `xml:"numberOfOccurences,attr"` 
} 

type labels struct { 
    XMLName xml.Name `xml:"labels"` 
    Label []label `xml:"label"` 
} 

type label struct { 
    XMLName  xml.Name `xml:"label"` 
    Label   string `xml:"label"` 
    LabelLanguage string `xml:"language,attr"` 
} 

type alert struct { 
    XMLName xml.Name `xml:"alert"` 
    Type    string  `xml:"type,attr"` 
    Identifier  string  `xml:"identifier,attr"` 
    DeclaredBy  string  `xml:"declaredBy,attr"` 
    StartedAt  string  `xml:"startedAt"` 
    Lastupdate  lastUpdate `xml:"lastupdate"` 
    Labels   labels  `xml:"label"` 
} 

私の第二のパッケージを書いた

package main 

import (
    "encoding/xml" 
    "fmt" 
    "io/ioutil" 
    "os" 

    "github.com/user/xmlparser/alert" 
    "github.com/golang/glog" 
) 

func main() { 

    //open XML file given in argument 
    xmlfile, err := os.Open(os.Args[1]) 
    if err != nil { 
     glog.Fatalf("opening file %s - error : %s", os.Args[1], err) 
    } 

    defer xmlfile.Close() 

    // read our opened xmlFile as a byte array. 
    byteValue, _ := ioutil.ReadAll(xmlfile) 

    // we initialize our alerts array 
    var al alerts.Alerts 

    // we unmarshal our byteArray which contains our 
    // xmlFiles content into 'al' which we defined above 
    xml.Unmarshal(byteValue, &al) 

    for i := 0; i < len(al.Alert); i++ { 
     fmt.Printf("Alert time : %s\n\n", al.Time) 

     fmt.Println("Type: " + al.Alert[i].Type) 
     fmt.Println("Identifier: " + al.Alert[i].Identifier) 
     fmt.Println("declaredBy: " + al.Alert[i].DeclaredBy) 

     fmt.Printf("startAt: %s\n", al.Alert[i].StartedAt) 
    } 
} 

私は時間、タイプ、識別子とDeclaredByを印刷することができますが、変数StartedAtは空です。私には理解できないことがあります。私の構造は正しく定義されていないと思う。 誰かが私を助けることができるなら...ありがとう!!!

+0

「xml.Unmarshal」から返されたエラーをチェックしましたか?あなたがしている場合は、あなたの構造タグにだけでなく、あなたのXMLでエラーの束を持っていることがわかります。 – mkopriva

+0

はいエラーは返されていません – CaptainFrance

+3

あなたはそれについて本当ですか?私はあなたのサンプルコードをコピーしており、すべてが 'xml.Unmarshal'から返された一連のエラーがあります。それらを修正した後、startedAtは正しくアンマーシャリングされます。 – mkopriva

答えて

0

StartedAtを単なる文字列として定義する必要があるようです。 Take a look at this question and example。あなたはそれがinnerxml文字列にアクセスできるようにそれ自身の構造体としてStartedAtを定義する必要があります。

type StartedAt struct { 
    Raw string `xml:",innerxml"` 
} 

type alert struct { 
    XMLName xml.Name `xml:"alert"` 
    Type    string  `xml:"type,attr"` 
    Identifier  string  `xml:"identifier,attr"` 
    DeclaredBy  string  `xml:"declaredBy,attr"` 
    StartedAt  StartedAt `xml:"startedAt"` 
} 
+1

'StartedAt'を文字列として定義する際には何も問題ありません。さまざまなエラーがXMLデータと構造タグの両方で解決されると、正常に動作します。 [遊び場](https://play.golang.org/p/h-lq9dQeTV) –

+0

ご協力ありがとうございます。問題は私のXMLファイルが間違っていたことに起因します。 @mkoprivaと同じように、私のXMLファイルは形式が違っているので、Unmarshalの戻りを確認する必要があります。私のコードが動作!問題はない :) – CaptainFrance