Я хочу десериализовать данный файл 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>