>백엔드 개발 >Golang >Golang에서 XML 데이터를 효율적으로 탐색하는 방법은 무엇입니까?

Golang에서 XML 데이터를 효율적으로 탐색하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-29 12:23:13935검색

How to Efficiently Traverse XML Data in Golang?

Golang에서 XML 데이터 탐색

Golang에서 XML 데이터를 탐색하려면 재귀 구조체를 구성하고 걷기 기능을 사용하여 바닐라 인코딩/xml 접근 방식을 활용할 수 있습니다. .

구조체 정의 및 걷기 기능

type Node struct {
    XMLName xml.Name
    Content []byte `xml:",innerxml"`
    Nodes   []Node `xml:",any"`
}

func walk(nodes []Node, f func(Node) bool) {
    for _, n := range nodes {
        if f(n) {
            walk(n.Nodes, f)
        }
    }
}

사용 예

다음 XML을 고려하세요.

<content>
    <p>this is content area</p>
    <animal>
        <p>This id dog</p>
        <dog>
           <p>tommy</p>
        </dog>
    </animal>
    <birds>
        <p>this is birds</p>
        <p>this is birds</p>
    </birds>
    <animal>
        <p>this is animals</p>
    </animal>
</content>

XML을 순회하고 각 노드와 해당 하위 항목을 처리하려면:

  1. XML을 다음으로 역마샬링합니다. struct:

    var content Node
    if err := xml.Unmarshal(xmlData, &content); err != nil {
     // handle error
    }
  2. walk 함수를 사용하여 구조체를 살펴봅니다.

    walk(content.Nodes, func(n Node) bool {
     // Process the node or traverse its child nodes here
     fmt.Printf("Node: %s\n", n.XMLName.Local)
     return true
    })

속성이 있는 향상된 버전

속성이 있는 노드의 경우 향상된 기능은 다음과 같습니다. 버전:

type Node struct {
    XMLName xml.Name
    Attrs   []xml.Attr `xml:",any,attr"`
    Content []byte     `xml:",innerxml"`
    Nodes   []Node     `xml:",any"`
}

func (n *Node) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    n.Attrs = start.Attr
    type node Node

    return d.DecodeElement((*node)(n), &start)
}

이를 통해 노드 처리 로직 내의 속성에 액세스할 수 있습니다.

위 내용은 Golang에서 XML 데이터를 효율적으로 탐색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.