Невозможно проанализировать XML "конфликты с полем" с кодировкой / xml в go - PullRequest
0 голосов
/ 16 января 2020

Я хочу десериализовать данный файл xml, но столкнулся с проблемами с элементом, который может иметь внутренний текст или другой элемент. См. params>param>value>array>data>value>struct>member>value.

Возможно ли создать структуру, которая могла бы десериализовать оба?

Код

reader := bytes.NewReader(content)
decoder := xml.NewDecoder(reader)
decoder.CharsetReader  = charset.NewReaderLabel
type Events struct {
    Name   []string `xml:"params>param>value>array>data>value>struct>member>value"`
    Values []string `xml:"params>param>value>array>data>value>struct>member>value>array>data>value"`
}

events := Events{}
if err := decoder.Decode(&events); err != nil {
    log.Fatalf("unable to parse XML '%s'", err)
}
fmt.Println("stack",events)

Ошибка

невозможно для анализа XML 'main.Events поле «Имя» с тегом «params> param> value> array> data> value> struct> member> value» конфликтует с полем «Значения» с тегом «params> param> value> array > data> value> struct> member> value> array> data> value "'

Обходной путь

Мой обходной путь сначала десериализуется до этого пути:

Methods []Event `xml:"params>param>value>array>data>value"`

затем это для methodName:

Value []string `xml:"member>value"`

, а затем это для различных элементов value:

Value []string `xml:"member>value>array>data>value"`

и потому что существуют различные типы значений, такие как i4 и double десериализовать это в конце:

ValueInt4    string `xml:"member>value>array>data>value>i4"`
ValueDouble  string `xml:"member>value>array>data>value>double"`
ValueBoolean string `xml:"member>value>array>data>value>boolean"`

Этот обходной путь не очень хорош.

XML

<?xml version="1.0" encoding="iso-8859-1"?>
<methodCall>
    <methodName>system.multicall</methodName>
    <params>
        <param>
            <value>
                <array>
                    <data>
                        <value>
                            <struct>
                                <member>
                                    <name>methodName</name>
                                    <value>event</value>
                                </member>
                                <member>
                                    <name>params</name>
                                    <value>
                                        <array>
                                            <data>
                                                <value>1</value>
                                                <value>NEQ0000000:4</value>
                                                <value>FAULT_REPORTING</value>
                                                <value>
                                                    <i4>0</i4>
                                                </value>
                                            </data>
                                        </array>
                                    </value>
                                </member>
                            </struct>
                        </value>
                        <value>
                            <struct>
                                <member>
                                    <name>methodName</name>
                                    <value>event</value>
                                </member>
                                <member>
                                    <name>params</name>
                                    <value>
                                        <array>
                                            <data>
                                                <value>1</value>
                                                <value>NEQ0000000:4</value>
                                                <value>BATTERY_STATE</value>
                                                <value>
                                                    <double>2.500000</double>
                                                </value>
                                            </data>
                                        </array>
                                    </value>
                                </member>
                            </struct>
                        </value>
                    </data>
                </array>
            </value>
        </param>
    </params>
</methodCall>
...