LINUX.ORG.RU

Не могу распарсить XML

 ,


0

1

На входе есть строка с подобной структуры XML:

<body>
    <stream:features>
        <mechanisms>
            <mechanism>PLAIN</mechanism>
            <mechanism>DIGEST-MD5</mechanism>
            <mechanism>SCRAM-SHA-1</mechanism>
        </mechanisms>
    </stream:features>
</body>
Нужен массив значений «mechanism». Для распарсивания использую структуры:
type XMLQuery struct {
	XMLName xml.Name `xml:"body"`
	Mechanisms MechanismsXMLQuery `xml:"stream:features>mechanisms"`
}

type MechanismsXMLQuery struct {
	Mechanism []string `xml:"mechanism"`
}
С ними всё в порядке, ибо генерация с их помощью XML работает как положено. А вот обратное действие (парсинг XML), которое мне нужно, нет.
Я выяснил, что это происходит из-за тега:
    <stream:features>
Так, если структура будет выглядеть следующим образом:
<body>
    <streamfeatures>
        <mechanisms>
            <mechanism>PLAIN</mechanism>
            <mechanism>DIGEST-MD5</mechanism>
            <mechanism>SCRAM-SHA-1</mechanism>
        </mechanisms>
    </streamfeatures>
</body>
А код исправить соответствующим образом, то всё парсится как надо. Что не так с этим тегом? Сдаётся мне, это как-то прописано в спецификации xml.



Последнее исправление: CYB3R (всего исправлений: 2)

Поспешил с вопросом. Ознакомился с описанием XML. Первая часть - это namespace. Стало быть, структура для парсинга будет иметь такой вид:

    type XMLQuery struct {
        XMLName xml.Name `xml:"body"`
	Mechanisms MechanismsXMLQuery `xml:"features>mechanisms"`
    }
Так же ответ здесь: https://groups.google.com/forum/#!topic/golang-nuts/uBMo1BpaQCM

Sense
() автор топика

а нельзя ли через «рефлексии» создавать нужный тип(и) из эталона а затем уже им(типом) парсить входные данные.

т.е по стилю - задача вручную Go-типа на основе внешней - как то вот это «некрасиво».

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

По поводу возможности создания типа из эталона в принципе не интересовался. В моей ситуации это, вроде, не применимо. Ибо приходится генерировать XML, отправлять его, получать ответ в том же или близком формате, который затем парсить.

Хотя, действительно, в результате получилось очень некрасивое решение. Причина - базовая часть всех XML'ок - одна, но с каждым очередным запросом появляется свой специфичный тег с некими аттрибутами и значением. В результате в структуре появилась туча описаний подобных тегов:

SomeTag *SomeTagXMLQuery `xml:"tagname,omitempty"`
А для каждого тега - структура.

Sense
() автор топика
Ответ на: комментарий от Sense

а xpath не подойдет? имхо это будет проще если ты не знаешь какие элементы у тебя будут.

exception13 ★★★★★
()
Ответ на: комментарий от Sense

Можно сделать как-нибудь так. В этом случае не нужно объявлять отдельную структуру для каждого нового тега, но валидность придётся проверять ручками. Мне лично больше нравится явное описание всех структур.

Laz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.