第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

獲取原始元素表示,包括開(kāi)始和結(jié)束標(biāo)簽

獲取原始元素表示,包括開(kāi)始和結(jié)束標(biāo)簽

Go
至尊寶的傳說(shuō) 2023-07-31 17:34:39
我知道 golang xml,innerxml標(biāo)簽,它允許將元素內(nèi)部?jī)?nèi)容作為原始 xml 獲取。但我需要的是獲取整個(gè)元素(開(kāi)放標(biāo)簽、內(nèi)部?jī)?nèi)容、關(guān)閉標(biāo)簽)作為原始數(shù)據(jù)。這是一個(gè)我想以這種方式解析的示例。我想獲得整體<Useful>及其所有可能的屬性元素,并避免獲得無(wú)用的元素。package mainimport (    "encoding/xml"    "fmt")const data = `<Document>    <Useless1>        blah-blah    </Useless1>    <Useless2>        blah-blah    </Useless2>    <Useful someAttr="someVal">        <InnerField1>Inner field 1 value</InnerField1>        <InnerField2>Inner field 2 value</InnerField2>        <InnerField3>Inner field 3 value</InnerField3>    </Useful>    <Useless3>        blah-blah    </Useless3></Document>`func main() {    doc := Document{}    err := xml.Unmarshal([]byte(data), &doc)    if err != nil {        panic(err)    }    fmt.Println(doc.Useful.Data)}type Document struct {    XMLName xml.Name `xml:"Document"`    Useful  struct {        Data string `xml:",innerxml"`    } `xml:"Useful"`}游樂(lè)場(chǎng)中代碼的鏈接位于: https: //goplay.space/#0KDXiRKDwlY這就是我得到的:    <InnerField1>Inner field 1 value</InnerField1>     <InnerField2>Inner field 2 value</InnerField2>     <InnerField3>Inner field 3 value</InnerField3>這就是我想要得到的:<Useful someAttr="someVal">     <InnerField1>Inner field 1 value</InnerField1>     <InnerField2>Inner field 2 value</InnerField2>     <InnerField3>Inner field 3 value</InnerField3></Useful>請(qǐng)注意,我正在使用的實(shí)際結(jié)構(gòu)要復(fù)雜得多。我不想將整個(gè)<Document>內(nèi)部?jī)?nèi)容作為原始 xml 獲取,然后對(duì)其進(jìn)行解析,嘗試手動(dòng)刪除無(wú)用的元素。該<Useful>部分各不相同,因此我無(wú)法對(duì)例如屬性進(jìn)行硬編碼,因?yàn)樗鼈兛赡芤蛞粋€(gè)文檔而異。
查看完整描述

1 回答

?
料青山看我應(yīng)如是

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超8個(gè)贊

也捕獲屬性

您可以在結(jié)構(gòu)中使用附加字段Useful來(lái)捕獲(類型切片的xml.Attr)所有屬性,如下所示:

Useful? struct {

? ? Attrs []xml.Attr `xml:",any,attr"`

? ? Data? string? ? ?`xml:",innerxml"`

} `xml:"Useful"`

添加另一個(gè)屬性時(shí)<Useful>:


<Useful someAttr="someVal" someAttr2="someVal2">

? ? ...

<Useful>

并使用 輸出結(jié)果fmt.Printf("%+v", doc.Useful),輸出將是(在Go Playground上嘗試一下):

{Attrs:[{Name:{Space:?Local:someAttr}?Value:someVal}?{Name:{Space:?Local:someAttr2}?Value:someVal2}]?Data:
????????<InnerField1>Inner?field?1?value</InnerField1>
????????<InnerField2>Inner?field?2?value</InnerField2>
????????<InnerField3>Inner?field?3?value</InnerField3>
????}

真正獲得完整的原始 XML

另一種更復(fù)雜的方法是使用xml.Decoder標(biāo)記讀取輸入,并標(biāo)記 的開(kāi)始和結(jié)束位置<Useful>。然后你就可以獲得完整的原始XML?<Useful>。

它可能是這樣的:

dec := xml.NewDecoder(strings.NewReader(data))


var start, end int64

foundStart := false

for {

? ? if !foundStart {

? ? ? ? start = dec.InputOffset()

? ? }

? ? t, err := dec.Token()

? ? if err != nil {

? ? ? ? if err != io.EOF {

? ? ? ? ? ? fmt.Println(err)

? ? ? ? }

? ? ? ? break

? ? }

? ? if se, ok := t.(xml.StartElement); ok {

? ? ? ? if se.Name.Local == "Useful" {

? ? ? ? ? ? foundStart = true

? ? ? ? }

? ? }

? ? if se, ok := t.(xml.EndElement); ok {

? ? ? ? if se.Name.Local == "Useful" {

? ? ? ? ? ? end = dec.InputOffset()

? ? ? ? ? ? // We may break here, we got what we wanted

? ? ? ? ? ? break

? ? ? ? }

? ? }

}


fmt.Println(data[start:end])

它輸出(在Go Playground上嘗試):


<Useful someAttr="someVal" someAttr2="someVal2">

? ? ? ? <InnerField1>Inner field 1 value</InnerField1>

? ? ? ? <InnerField2>Inner field 2 value</InnerField2>

? ? ? ? <InnerField3>Inner field 3 value</InnerField3>

? ? </Useful>

由于我們不處理 的內(nèi)容,因此我們可以通過(guò)如下<Useful>使用來(lái)加快速度:Decoder.Skip()

dec := xml.NewDecoder(strings.NewReader(data))


var start, end int64

for {

? ? start = dec.InputOffset()

? ? t, err := dec.Token()

? ? if err != nil {

? ? ? ? if err != io.EOF {

? ? ? ? ? ? fmt.Println(err)

? ? ? ? }

? ? ? ? break

? ? }

? ? if se, ok := t.(xml.StartElement); ok {

? ? ? ? if se.Name.Local != "Useful" {

? ? ? ? ? ? continue

? ? ? ? }

? ? ? ? if err := dec.Skip(); err != nil {

? ? ? ? ? ? fmt.Println(err)

? ? ? ? ? ? break

? ? ? ? }

? ? ? ? end = dec.InputOffset()

? ? ? ? break

? ? }

}


fmt.Println(data[start:end])

輸出是一樣的。在Go Playground上試試這個(gè)。




查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 194 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)