• Как правильно распарсить XML в JSON?

    @Sinu5oid
    Хоть и некропост, но я всё же дам ответ
    В описании типа есть опечатка
    type XMLProfile struct {
      XMLName     xml.Name    `xml:"profile,omitempty"`
      ProfileName string      `xml:"profile_name",omitempty`
      Fields      []*XMLField `xml:"field,omitempty"`
    }

    Конкретно здесь: `xml:"profile_name",omitempty`
    Go не позволяет ошибаться в мета-информации структур, вот правильный вариант:
    `xml:"profile_name,omitempty"` - сначала бэктик, затем без пробелов: метка типа данных (xml), двоеточие, кавычки, имя в xml, запятая, дополнительные теги, кавычки (если нужно задать описание и для json - ставим пробел, повторяем всё то же самое), в завершении снова бэктик

    Вот и весь фикс :)
    Финальный код:
    package main
    
    import (
    	"encoding/json"
    	"encoding/xml"
    	"io/ioutil"
    	"log"
    	"os"
    )
    
    type XMLProfile struct {
    	XMLName     xml.Name    `xml:"profile,omitempty"`
    	ProfileName string      `xml:"profile_name,omitempty"`
    	Fields      []*XMLField `xml:"field,omitempty"`
    }
    
    type XMLField struct {
    	Name  string `xml:"name,omitempty"`
    	Type  string `xml:"type,omitempty"`
    	Value string `xml:"value,omitempty"`
    }
    
    func main() {
    	file, err := os.Open("example.xml")
    	if err != nil {
    		log.Println(err)
    	}
    
    	defer file.Close()
    
    	decoder := xml.NewDecoder(file)
    	for {
    		t, _ := decoder.Token()
    		if t == nil {
    			break
    		}
    
    		switch et := t.(type) {
    		case xml.StartElement:
    			if et.Name.Local == "profile" {
    				var object XMLProfile
    				decoder.DecodeElement(&object, &et)
    
    				resultData := map[string]map[string]string{
    					object.ProfileName: map[string]string{},
    				}
    
    				for _, val := range object.Fields {
    					resultData[object.ProfileName][val.Name] = val.Value
    				}
    				if out, err := json.MarshalIndent(resultData, "", " "); err != nil {
    					panic(err)
    				} else {
    					_ = ioutil.WriteFile("test.json", out, 0644)
    				}
    			}
    		}
    	}
    }
    Ответ написан
    1 комментарий
  • Go build: Не удается найти пакет, дублируется src в пути поиска пакета, в чем ошибка?

    Внутри $GOPATH создаются src, bin, pkg. Т.е сделайте GOPATH=/var/www/go

    А вообще завязывайте с $GOPATH и переходите на модули
    Ответ написан
    7 комментариев
  • Как из текста удалить все что в скобках?

    0xD34F
    @0xD34F Куратор тега Регулярные выражения
    str := "Gigabyte GA-B250M-DS3H (1,485)MSI B250M PRO-VD (MS-7A74) (1,199)MSI H110M PRO-VH PLUS (MS-7A15) (946)Asus H110M-K (816)Asrock B250M-HDV (807)MSI B250M PRO-VDH (MS-7A70) (667)MSI H110M PRO-VD (MS-7996) (663)"
    reg, _ := regexp.Compile("\\(.*?\\)")
    str = reg.ReplaceAllString(str, "")
    Ответ написан
    1 комментарий
  • Странный дизайн Rust?

    Rust это не C++. Почему он должен брать термины из C++?

    В Java вон тоже ссылки - это указатели в терминологии C++.

    Более того, ссылка от указателя отличается лишь абстракцией. В памяти это будут одинаковые ячейки, содержащие адрес.
    Ответ написан
    Комментировать
  • Как использовать "/" в регулярных выражениях?

    bitniks
    @bitniks
    Go/PHP/Symfony developer
    Экранировать обратной косой чертой
    \/rcon
    Ответ написан
    Комментировать
  • Почему не импортируется мой пакет?

    @nrgian
    Существует 2 основных способа расположения пакетов в Go:

    Внутри каталога указанного в переменной среды окружения GOPATH. Именно там и должен быть подкаталог src. Туда и кладете, например, в src/mydir/mypackage.
    Тогда всё, что лежит в этом src можно импортировать как import "mydir/mypackage"

    Второй способ - с модулями, но вы его не используйте.
    Ответ написан
    2 комментария
  • Go, как парсить XML?

    Примерно так: https://play.golang.org/p/yiKGZY4GZL

    package main
    
    import (
    	"encoding/xml"
    	"fmt"
    	"log"
    )
    
    type CNode struct {
    	Hash string `xml:"hash,attr"`
    	Node string `xml:"node,attr"`
    }
    
    type Features struct {
    	XMLName    xml.Name `xml:"stream features"`
    	Mechanisms []string `xml:"mechanisms>mechanism"`
    	C          CNode    `xml:"c"`
    }
    
    func main() {
    	raw_data := []byte(`
            <stream:features>
                <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
                <mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
                    <mechanism>PLAIN</mechanism>
                    <mechanism>DIGEST-MD5</mechanism>
                    <mechanism>SCRAM-SHA-1</mechanism>
                </mechanisms>
                <c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.process-one.net/en/ejabberd/' ver='NUUMEO3rKA30XLGO1FbA9EZT1rY='/>
                <register xmlns='http://jabber.org/features/iq-register'/>
            </stream:features>
        `)
    
    	var v Features
    	err := xml.Unmarshal(raw_data, &v)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	fmt.Printf("%+v\n", v)
    }


    В принципе, спецификация и пара примеров есть здесь https://golang.org/pkg/encoding/xml
    Ответ написан
    Комментировать