package main import ( "encoding/xml" "os" "github.com/rug-compling/alpinods" ) type docType struct { Alpino *Alpino_ds Filename string Varroot []interface{} Indexed []*NodeType } var noNode = &NodeType{ NodeAttributes: alpinods.NodeAttributes{ Begin: -1, End: -1, ID: -1, }, Node: []*NodeType{}, } type Alpino_ds struct { XMLName xml.Name `xml:"alpino_ds"` Node *NodeType `xml:"node,omitempty"` Sentence *sentType `xml:"sentence,omitempty"` } type sentType struct { Sent string `xml:",chardata"` SentId string `xml:"sentid,attr,omitempty"` } type NodeType struct { alpinods.NodeAttributes Node []*NodeType `xml:"node"` Parent *NodeType AxChildren []interface{} AxDescendantsOrSelf []interface{} } func parse(filename string) (*docType, error) { b, err := os.ReadFile(filename) if err != nil { return nil, err } var alpino Alpino_ds err = xml.Unmarshal(b, &alpino) if err != nil { return nil, err } doc := &docType{ Alpino: &alpino, Filename: filename, Varroot: []interface{}{alpino.Node}, Indexed: []*NodeType{}, } inspect(doc) return doc, nil } func inspect(q *docType) { var walk func(*NodeType) walk = func(node *NodeType) { for _, n := range node.Node { n.Parent = node walk(n) } node.AxChildren = make([]interface{}, 0) node.AxDescendantsOrSelf = make([]interface{}, 1) node.AxDescendantsOrSelf[0] = node for _, n := range node.Node { node.AxChildren = append(node.AxChildren, n) node.AxDescendantsOrSelf = append(node.AxDescendantsOrSelf, n.AxDescendantsOrSelf...) // niet n } if node.Index > 0 && (node.Cat != "" || node.Pt != "") { for node.Index >= len(q.Indexed) { q.Indexed = append(q.Indexed, nil) } q.Indexed[node.Index] = node } } walk(q.Alpino.Node) q.Alpino.Node.Parent = noNode }