Maison  >  Article  >  développement back-end  >  Comment laisser Golang faire la distinction entre les éléments XML avec espace de noms et sans espace de noms ?

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

WBOY
WBOYavant
2024-02-09 12:00:091145parcourir

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

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></image> 都是 <image></image> 元素,因为它们都有“图像”。为了过滤掉 <image>,我使用的方法是让 <code>image []struct 中的每个人检查其 url 是否为空字符串(因为对于 <image> 其 <code>url soit un attribut).

Une autre façon est d'écrire le mien unmarshal 函数来区分具有和不具有 itunes 命名空间的 xml 元素。基本上我希望 image []struct 仅保存元素 <image></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 <image></image> ? <image></image>

解决方法

请注意,字段顺序很重要。 itunesimage 有一个更具体的标签,因此它应该位于 image

Solution de contournement

<image></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)
}

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

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)
    }
}
🎜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/

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer