Reputation: 14179
I have the following struct
type Sitemap struct {
XMLName xml.Name `xml:"urlset"`
Namespace string `xml:"xmlns,attr"`
Schema string `xml:"xmlns:xsi,attr"`
SchemaLocation string `xml:"xsi:schemaLocation,attr"`
Root *URLItem
}
type URLItem struct {
XMLName xml.Name `xml:"url"`
Loc string `xml:"loc"`
LastMod string `xml:"lastmod,omitempty"`
Urls []*URLItem
}
func (s *Sitemap) AddURL(key string, url string) {
node, found := findURLItemRecursive(s.Root, key)
if found {
node.Urls = append(node.Urls, &URLItem{Loc: url})
}
}
func findURLItemRecursive(urlItem *URLItem, key string) (*URLItem, bool) {
if urlItem.Loc == key {
return urlItem, true
}
for _, urlItem := range urlItem.Urls {
return findURLItemRecursive(urlItem, key)
}
return nil, false
}
where the key
is the parent URL and url
is the child URL that is linked to the parent for the fact that the children it is found on the page of the parent.
For some unknown reasons findURLItemRecursive
is buggy.
The issue is that I can't attach more UrlItem
(s) at the second level.
I mean I can create the Root
item create the Urls
slices for the Root
item but then I can't create nested slices. So I can't go more than the first level.
I'm wondering if the function findURLItemRecursive
has any obvious bugs in Go that I can't spot.
Upvotes: 0
Views: 60
Reputation: 2440
I think this should work for you.
type Sitemap struct {
XMLName xml.Name `xml:"urlset"`
Namespace string `xml:"xmlns,attr"`
Schema string `xml:"xmlns:xsi,attr"`
SchemaLocation string `xml:"xsi:schemaLocation,attr"`
Root *URLItem
}
type URLItem struct {
XMLName xml.Name `xml:"url"`
Loc string `xml:"loc"`
LastMod string `xml:"lastmod,omitempty"`
Urls []*URLItem
}
func (s *Sitemap) AddURL(key string, url string) {
node, found := findURLItemRecursive(s.Root, key)
if found {
node.Urls = append(node.Urls, &URLItem{Loc: url})
}
}
func findURLItemRecursive(urlItem *URLItem, key string) (*URLItem, bool) {
if urlItem.Loc == key {
return urlItem, true
}
for _, urlItem := range urlItem.Urls {
item, found := findURLItemRecursive(urlItem, key)
if found {
return item, found
}
}
return nil, false
}
Upvotes: 1