2014-10-22 2 views
2

Я хотел бы иметь возможность отмечать мою структуру, не требуя знать, какой уровень будет вложен в XML-документ. Другими словами, я хочу, чтобы иметь возможность написать:Контекстно-агностические теги XML-структуры

type Elem struct { 
    Datum string `xml:"datum"` 
} 

И есть ли она работать на обоих

<elem> 
    <datum>Hello</datum> 
</elem> 

И

<list> 
    <elem> 
     <datum>Hello</datum> 
    </elem> 
</list> 

Однако, для того, чтобы последний пример работать (при попытке декодирования в []Elem), мне нужно использовать тег xml:"elem>datum", который неправильно декодирует первый пример. Есть ли способ определить тег XML, не зная, как будет внедрена структура? Смотрите здесь для простого примера:

http://play.golang.org/p/LpI2vKFpNE

ответ

1

Одним из способов решения этой проблемы является использование анонимного структуры:

func Test2_DecodeList() { 
    xmlData := "<list><elem><datum>Hello</datum></elem></list>" 
    var list struct { 
     Elems []Elem `xml:"elem"` 
    } 
    if err := xml.Unmarshal([]byte(xmlData), &list); err != nil { 
     fatal("Test2:", err) 
    } 

    if err := expectEq(1, len(list.Elems)); err != nil { 
     fatal("Test2:", err) 
    } 

    if err := expectEq("Hello", list.Elems[0].Datum); err != nil { 
     fatal("Test2:", err) 
    } 
} 

Пример: http://play.golang.org/p/UyYoyGgL_K

+1

Ах, это имеет смысл. Я пробовал что-то подобное, но это не сработало по независящей причине: http://play.golang.org/p/Nklq6nUnk9 (в основном, unmarshalling, кажется, удаляет внутренний кусок '[] Elem' и заменяет его новым один, поэтому любые ссылки, которые у вас есть на исходный фрагмент, не будут изменены с помощью немаршаллированных данных. Спасибо, это сводило меня с ума. Принято, +1. – weberc2

Смежные вопросы