Golang XML: unmarshal игнорирует пространство имен - PullRequest
1 голос
/ 25 марта 2019

Я внедряю сервис в нашей системе Go, который считывает данные из внешнего сервиса SOAP.Теперь, когда я пишу тесты для этого, я сталкиваюсь с этой проблемой:

unable to unmarshal request body for testing: expected element type <soapenv:Envelope> but have <Envelope>

Если я сбрасываю свои данные, у меня есть это:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" xmlns:v2 [...]

Так что у меня есть правильныепространство имен в XML.Для справки, это структура, в которую я пытаюсь разобрать данные:

type collectRequestXML struct {
    XMLName xml.Name `xml:"soapenv:Envelope"`
    SoapEnv string   `xml:"xmlns:soapenv,attr"`
    XMLNs   string   `xml:"xmlns:v2,attr"`
    Header  struct{} `xml:"soapenv:Header"`
    Body    struct {
        [...]
    }
}

Что я могу сделать, чтобы немаршал провалился?

См. эту игровую площадкуэлемент для справки .

1 Ответ

1 голос
/ 25 марта 2019

В документации пакета XML недостаточно написано о пространствах имен. Разбор очень прост. Существует небольшая поддержка пространств имен. Он может анализировать XML, но при создании XML ist недостаточно поддерживает пространство имен.

Ваша структура работает, когда вы удаляете информацию о пространстве имен внутри определения XMLName:

type myStruct struct {
    XMLName xml.Name `xml:"Envelope"`
    SoapEnv string   `xml:"xmlns:soapenv,attr"`
    Header  struct{} `xml:"soapenv:Header"`
    Body    struct {
        MyData string `xml:"my-data"`
    }
}

https://play.golang.org/p/UppXwx0X0i9

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