Maison > développement back-end > Golang > le corps du texte

Comment laisser Golang faire la distinction entre les éléments XML avec espace de noms et sans espace de noms ?

WBOY
Libérer: 2024-02-09 12:00:09
avant
1150 Les gens l'ont consulté

Comment laisser Golang faire la distinction entre les éléments XML avec espace de noms et sans espace de noms ?

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 !

Contenu de la question

Supposons que j'ai les données XML suivantes :

<image> 
  <url> http://sampleurl.com
  </url>
</image>

<itunes:image url="http://sampleitunesurl.com" />  //xmldata
Copier après la connexion

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"`

}
Copier après la connexion

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>
    }
}
Copier après la connexion

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:imageurl 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

Solution de contournement

<image> 标签中的 image/url ,您可以像这样定义 responseVeuillez 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)
}
Copier après la connexion

Si vous avez juste besoin de xmlname的字段捕获元素名称,并检查该字段的spacestructure :

type response struct {
    xmlname xml.name `xml:"resp"`
    image   []string `xml:"image>url"`
}
Copier après la connexion

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)
    }
}
Copier après la connexion
🎜Le résultat de la démo ci-dessus est : 🎜
namespace: "", url: http://sampleUrl.com
namespace: "http://www.itunes.com/dtds/podcast-1.0.dtd", url: http://sampleItunesUrl.com/
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!