Как указать тег XML struct для элемента с атрибутами и содержимым? - PullRequest
1 голос
/ 30 апреля 2020

Мне нужно проанализировать что-то (в программе Go), которое выглядит следующим образом:

<PARENT>
    <FIRST KEY="something">Value</FIRST>
    <SECOND KEY="something">Value</SECOND>
</PARENT>          

Я пробовал:

type SomeType struct {
    XMLName     xml.Name `xml:"PARENT"`
    FirstValue  string   `xml:"FIRST"`
    FirstKey    string   `xml:"FIRST>KEY,attr"`
    SecondValue string   `xml:"SECOND"`
    FirstKey    string   `xml:"SECOND>KEY,attr"`
}

, но я получаю эту ошибку:

xml: FIRST>KEY chain not valid with attr flag

Какой правильный способ сделать это?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Ответом оказывается, что для атрибутов вы не используете цепочку идентификаторов. Вместо этого вы используете идентификатор в списке, разделенном запятыми, например:

type SomeType struct {
    XMLName     xml.Name `xml:"PARENT"`
    FirstValue  string   `xml:"FIRST"`
    FirstKey    string   `xml:"FIRST,KEY,attr"`
    SecondValue string   `xml:"SECOND"`
    SecondKey   string   `xml:"SECOND,KEY,attr"`
}

Моя интуиция заключалась в том, что все в списке, разделенном запятыми, были ключевыми словами (например, attr или omitempty), поэтому я не стал Я не ожидал, что там будет выражено удостоверение личности (например, KEY), но моя интуиция оказалась неверной. Более подробное обсуждение этого вопроса: здесь .

Редактировать: Я говорил слишком рано. Приведенное выше не принимает значение FirstKey или SecondKey.

1 голос
/ 30 апреля 2020

Вы можете объявить тип, который соответствует xml в структуре:

type T struct {
    XMLName xml.Name `xml:"PARENT"`
    First   Value    `xml:"FIRST"`
    Second  Value    `xml:"SECOND"`
}

type Value struct {
    Key   string `xml:"KEY,attr"`
    Value string `xml:",chardata"`
}

https://play.golang.com/p/AUoKBxn1Zu5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...