What is invalid character entity &ccb

huangapple go评论92阅读模式
英文:

What is invalid character entity &ccb

问题

我有这个游乐场:https://go.dev/play/p/uEpYEWaQaV0
但是我不知道问题出在哪里,为什么它不工作!我得到了以下错误:

invalid character entity &ccb

我的代码是:

package main

import (
	"encoding/xml"
	"fmt"
)

type catalog struct {
	Id string `xml:"id"`
}

type price struct {
	Subtotal    int    `xml:"subtotal"`
	Currency    string `xml:"currency"`
	Total       int    `xml:"total"`
	PriceStatus string `xml:"price_status"`
}

type image struct {
	Url string `xml:"url"`
	Id  int    `xml:"id"`
}

type product struct {
	Id         int    `xml:"id"`
	RetailerId int    `xml:"retailer_id"`
	Image      image  `xml:"image"`
	Price      int    `xml:"price"`
	Currency   string `xml:"currency"`
	Name       string `xml:"name"`
	Quantity   int    `xml:"quantity"`
}

type order struct {
	Product product `xml:"product"`
	Catalog catalog `xml:"catalog"`
	Price   price   `xml:"price"`
}

type Iq struct {
	XMLName xml.Name `xml:"iq"`
	Order   order    `xml:"order"`
}

func main() {
	contents := `<iq from="s.whatsapp.net" id="162.120-3" type="result">
  <order creation_ts="1651703902" id="1046755402590219">
    <product>
      <id>8312993582051445</id>
      <retailer_id>291</retailer_id>
      <image>
        <url>https://mmg.whatsapp.net/v/t45.5328-4/279646282_7510595942346471_4295336878174066544_n.jpg?stp=dst-jpg_p100x100&amp;ccb=1-5&amp;_nc_sid=c48759&amp;_nc_ohc=OMyHhkGxzRoAX8Dn93Q&amp;_nc_ad=z-m&amp;_nc_cid=0&amp;_nc_ht=mmg.whatsapp.net&amp;oh=01_AVw_0loIIuK1LP-n5OL1hdpRmNYhAiUjLGk20FCclgNXCA&amp;oe=62774C93</url>
        <id>7510595939013138</id>
      </image>
      <price>5000</price>
      <currency>SAR</currency>
      <name>coffee</name>
      <quantity>1</quantity>
    </product>
    <catalog><id>326185462964376</id></catalog>
    <price>
      <subtotal>5000</subtotal>
      <currency>SAR</currency>
      <total>5000</total>
      <price_status>provided</price_status>
    </price>
  </order>
</iq>`

	iq := &Iq{}

	err := xml.Unmarshal([]byte(contents), &iq)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%v\n", iq.Order)
}
英文:

I've this playground: https://go.dev/play/p/uEpYEWaQaV0
But did not get what is the issue and why it is not working! and I'm getting the error:

invalid character entity &amp;ccb

My code is:

package main

import (
	&quot;encoding/xml&quot;
	&quot;fmt&quot;
)

type catalog struct {
	Id string `xml:&quot;id&quot;`
}

type price struct {
	Subtotal    int    `xml:&quot;subtotal&quot;`
	Currency    string `xml:&quot;currency&quot;`
	Total       int    `xml:&quot;total&quot;`
	PriceStatus string `xml:&quot;price_status&quot;`
}

type image struct {
	Url string `xml:&quot;url&quot;`
	Id  int    `xml:&quot;id&quot;`
}

type product struct {
	Id         int    `xml:&quot;id&quot;`
	RetailerId int    `xml:&quot;retailer_id&quot;`
	Image      image  `xml:&quot;image&quot;`
	Price      int    `xml:&quot;price&quot;`
	Currency   string `xml:&quot;currency&quot;`
	Name       string `xml:&quot;name&quot;`
	Quantity   int    `xml:&quot;quantity&quot;`
}

type order struct {
	Product product `xml:&quot;product&quot;`
	Catalog catalog `xml:&quot;catalog&quot;`
	Price   price   `xml:&quot;price&quot;`
}

type Iq struct {
	XMLName xml.Name `xml:&quot;iq&quot;`
	Order   order    `xml:&quot;order&quot;`
}

func main() {
	contents := `&lt;iq from=&quot;s.whatsapp.net&quot; id=&quot;162.120-3&quot; type=&quot;result&quot;&gt;
  &lt;order creation_ts=&quot;1651703902&quot; id=&quot;1046755402590219&quot;&gt;
    &lt;product&gt;
      &lt;id&gt;8312993582051445&lt;/id&gt;
      &lt;retailer_id&gt;291&lt;/retailer_id&gt;
      &lt;image&gt;
        &lt;url&gt;https://mmg.whatsapp.net/v/t45.5328-4/279646282_7510595942346471_4295336878174066544_n.jpg?stp=dst-jpg_p100x100&amp;ccb=1-5&amp;_nc_sid=c48759&amp;_nc_ohc=OMyHhkGxzRoAX8Dn93Q&amp;_nc_ad=z-m&amp;_nc_cid=0&amp;_nc_ht=mmg.whatsapp.net&amp;oh=01_AVw_0loIIuK1LP-n5OL1hdpRmNYhAiUjLGk20FCclgNXCA&amp;oe=62774C93&lt;/url&gt;
        &lt;id&gt;7510595939013138&lt;/id&gt;
      &lt;/image&gt;
      &lt;price&gt;5000&lt;/price&gt;
      &lt;currency&gt;SAR&lt;/currency&gt;
      &lt;name&gt;coffee&lt;/name&gt;
      &lt;quantity&gt;1&lt;/quantity&gt;
    &lt;/product&gt;
    &lt;catalog&gt;&lt;id&gt;326185462964376&lt;/id&gt;&lt;/catalog&gt;
    &lt;price&gt;
      &lt;subtotal&gt;5000&lt;/subtotal&gt;
      &lt;currency&gt;SAR&lt;/currency&gt;
      &lt;total&gt;5000&lt;/total&gt;
      &lt;price_status&gt;provided&lt;/price_status&gt;
    &lt;/price&gt;
  &lt;/order&gt;
&lt;/iq&gt;`

	iq := &amp;Iq{}

	err := xml.Unmarshal([]byte(contents), &amp;iq)
	if err != nil {
		panic(err)
	}
	fmt.Printf(&quot;%v\n&quot;, iq.Order)
}

答案1

得分: 5

基于@collapsar的答案...

尽管XML格式不正确,但您仍然可以通过创建一个Decoder实例并关闭Strict模式来处理它:

d := xml.NewDecoder(bytes.NewReader([]byte(contents)))
d.Strict = false
err := d.Decode(&iq)
if err != nil {
    panic(err)
}
fmt.Printf("%v\n", iq.Order)

Go Playground

有关参考,请参阅https://pkg.go.dev/encoding/xml#Decoder。

英文:

Building on the answer from @collapsar...

Despite the XML being malformed, you can still process it by creating a Decoder instance and turning off Strict mode:

d := xml.NewDecoder(bytes.NewReader([]byte(contents)))
d.Strict = false
err := d.Decode(&amp;iq)
if err != nil {
panic(err)
}
fmt.Printf(&quot;%v\n&quot;, iq.Order)

Go Playground

For reference, see https://pkg.go.dev/encoding/xml#Decoder.

答案2

得分: 3

你的代码中的 XML 不是格式良好的。

XML 片段包含一个名为 url 的元素,其中包含一个带有多个参数的 URL,这些参数在查询字符串部分由和号 &amp; 分隔。

在 XML 中,这个符号具有特殊的语义,用于引用实体(一种符号常量)- 你不能单独使用它。

要么将 URL 写成 CDATA 部分(其中的内容被视为字面值,语法:&lt;![CDATA[...]]&gt;),要么将所有的 &amp; 替换为 &amp;amp;(使用实体引用来转义和号符号,在这里有效地用作转义机制)。

英文:

The xml in your code is not well-formed.

The xml fragment contains an element url which contains a url with multiple parameters in its query string portion, separated by ampersands &amp;.

This symbol has special semantics in xml in initiating an entity reference (kind of a symbolic constant) - you cannot use it in isolation.

Either write the url as a CDATA section (the contents of which are considered a literal, Syntax: &lt;![CDATA[...]]&gt;) or replace all occurrences of &amp; with &amp;amp; (using the entity reference for the sports and symbol; effectively used here as an escaping mechanism).

huangapple
  • 本文由 发表于 2022年5月5日 06:48:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/72120226.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定