L'éditeur PHP Zimo partagera avec vous comment permettre à Golang de distinguer les éléments XML avec des espaces de noms et sans espaces de noms. Lorsqu'il s'agit de données XML, l'espace de noms est un concept important qui peut nous aider à mieux organiser et distinguer les différents éléments XML. Cet article expliquera comment utiliser le package XML de Golang pour analyser et traiter des éléments XML avec et sans espaces de noms, et fournira quelques exemples de codes pour des applications pratiques. Que vous soyez débutant ou développeur expérimenté, vous obtiendrez de précieuses connaissances et conseils grâce à cet article. Explorons ensemble ce sujet amusant et pratique !
Supposons que j'ai les données XML suivantes :
<image> <url> http://sampleurl.com </url> </image> <itunes:image url="http://sampleitunesurl.com" /> //xmldata
J'utilise cette structure pour le décoder :
type response struct { xmlname xml.name `xml:"resp"` image []struct { url string `xml:"url"` } `xml:"image"` itunesimage struct { url string `xml:"url,attr"` } `xml:"http://www.itunes.com/dtds/podcast-1.0.dtd image"` }
J'ai ce code :
var resp Response err := xml.Unmarshal([]byte(xmlData), &resp) if err != nil { fmt.Printf("Error decoding XML: %s\n", err) return } for _, img := range resp.Image{ if img.URL != "" { //<image>, not <itunes:image> } }
Gérer le décodage
Le problème que j'ai, c'est qu'il semble que image []struct
认为 <image>
和 <itunes:image
都是 <image>
元素,因为它们都有“图像”。为了过滤掉 <itunes:image
,我使用的方法是让 image []struct
中的每个人检查其 url
是否为空字符串(因为对于 <itunes:image
其 url
soit un attribut).
Une autre façon est d'écrire le mien unmarshal
函数来区分具有和不具有 itunes
命名空间的 xml 元素。基本上我希望 image []struct
仅保存元素 <image>
Je me demande si Go a des fonctionnalités intégrées pour se différencier ? Ou dois-je écrire du code pour filtrer <itunes:image>
? <itunes:image>
?
请注意,字段顺序很重要。 itunesimage
有一个更具体的标签,因此它应该位于 image
<image>
标签中的 image/url
,您可以像这样定义 response
Veuillez noter que l'ordre des champs est important. itunesimage
a une balise plus spécifique, elle devrait donc précéder image
.
package main import ( "encoding/xml" "fmt" ) func main() { type response struct { xmlname xml.name `xml:"resp"` itunesimage struct { url string `xml:"url,attr"` } `xml:"http://www.itunes.com/dtds/podcast-1.0.dtd image"` image []struct { url string `xml:"url"` } `xml:"image"` } xmldata := ` <resp xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"> <image> <url>http://sampleurl.com</url> </image> <itunes:image url="http://sampleitunesurl.com/" /> </resp> ` var resp response err := xml.unmarshal([]byte(xmldata), &resp) if err != nil { fmt.printf("error decoding xml: %s\n", err) return } fmt.printf("itunesimage: %v\n", resp.itunesimage) fmt.printf("images: %v\n", resp.image) }
Si vous avez juste besoin de xmlname
的字段捕获元素名称,并检查该字段的space
structure :
type response struct { xmlname xml.name `xml:"resp"` image []string `xml:"image>url"` }
Concernant la question générale du titre (comment faire en sorte que Golang différencie les éléments XML avec et sans espaces de noms ?), vous pouvez utiliser un membre nommé
. Voir la démo ci-dessous : 🎜package main import ( "encoding/xml" "fmt" ) func main() { type response struct { xmlname xml.name `xml:"resp"` image []struct { xmlname xml.name url string `xml:"url"` } `xml:"image"` } xmldata := ` <resp xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"> <image> <url>http://sampleurl.com</url> </image> <itunes:image> <url>http://sampleitunesurl.com/</url> </itunes:image> </resp> ` var resp response err := xml.unmarshal([]byte(xmldata), &resp) if err != nil { fmt.printf("error decoding xml: %s\n", err) return } for _, img := range resp.image { fmt.printf("namespace: %q, url: %s\n", img.xmlname.space, img.url) } }
namespace: "", url: http://sampleUrl.com namespace: "http://www.itunes.com/dtds/podcast-1.0.dtd", url: http://sampleItunesUrl.com/
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!