获取原始元素表示形式,包括打开和关闭标签

我知道golang xml ,innerxml标记,它允许获取元素内部内容作为原始xml。但是我需要将整个元素(打开标签,内部内容,关闭标签)作为原始数据获取。

这里是我想以这种方式解析的样本。我想获取整个<Useful>及其所有可能的attribute元素,并避免获取无用的元素。

package main

import (
    "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"`
}

在操场上的代码的链接在这里: 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>

请注意,我正在使用的实际结构要复杂得多。我不想将整个<Document>内部内容作为原始xml进行解析,然后尝试手动摆脱无用的元素。 <Useful>部分各不相同,因此我无法进行硬编码,例如属性会导致它们在一个文档之间可能会有所不同。

keep2100 回答:获取原始元素表示形式,包括打开和关闭标签

也捕获属性

您可以在"$.members[*].['firstName','lastName']" 结构中使用一个附加字段来捕获所有属性(类型为xml.Attr的切片),如下所示:

Useful

Useful struct { Attrs []xml.Attr `xml:",any,attr"` Data string `xml:",innerxml"` } `xml:"Useful"` 添加另一个属性时:

<Useful>

然后用<Useful someAttr="someVal" someAttr2="someVal2"> ... <Useful> 输出结果,输出将是(在Go Playground上尝试):

fmt.Printf("%+v",doc.Useful)

真正获得完整的原始XML

另一种更复杂的方法是使用xml.Decoder通过标记读取输入,并标记{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> } 的开始和结束位置。然后,您可以获得<Useful>的完整原始XML。

它是这样的:

<Useful>

它输出(在Go Playground上尝试):

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])

由于我们不处理<Useful someAttr="someVal" someAttr2="someVal2"> <InnerField1>Inner field 1 value</InnerField1> <InnerField2>Inner field 2 value</InnerField2> <InnerField3>Inner field 3 value</InnerField3> </Useful> 的内容,因此可以通过使用Decoder.Skip()来加快处理速度,

<Useful>

输出是相同的。在Go Playground上尝试这个。

本文链接:https://www.f2er.com/3138511.html

大家都在问