> 백엔드 개발 > Golang > XPath를 사용하지 않고 Go에서 XML 하위 항목을 효율적으로 탐색하려면 어떻게 해야 합니까?

XPath를 사용하지 않고 Go에서 XML 하위 항목을 효율적으로 탐색하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-12-03 20:15:17
원래의
993명이 탐색했습니다.

How Can I Efficiently Traverse XML Descendants in Go Without Using XPath?

Go로 XML 데이터 탐색

Go에서 XML 데이터를 탐색하는 데 어려움을 겪고 있습니다. 특히 정확한 XPath를 지정하지 않고 특정 노드. 이 작업에 도움이 될 수 있는 접근 방식을 살펴보겠습니다.

재귀 및 바닐라 XML 인코딩

깊은 순회를 달성하려면 재귀 구조체와 간단한 걷기를 활용할 수 있습니다. Go의 바닐라 인코딩/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)
        }
    }
}
로그인 후 복사

이 코드에서 walk 함수는 각 노드의 자식을 재귀적으로 방문합니다. 개별 노드에 대한 작업을 수행하기 위해 사용자 정의 함수 f를 제공할 수 있습니다.

예를 들어, 제공한 XML에서 아래와 같이 워크 함수를 사용하여 유형에 따라 노드를 처리할 수 있습니다.

func handleNode(n Node) bool {
    switch n.XMLName.Local {
    case "p":
        // Process paragraphs
    case "dog":
        // Process dogs
    }
    return true // Keep traversing
}

walk([]Node{root}, handleNode)
로그인 후 복사

속성 포함

노드와 관련된 속성에 액세스해야 하는 경우 Node 구조체를 확장할 수 있습니다. 그에 따라 UnmarshalXML 메서드를 사용자 정의합니다.

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)
}
로그인 후 복사

이 수정된 구조를 사용하면 walk 함수 내에서 속성을 검색할 수 있습니다.

func handleNode(n Node) bool {
    for _, a := range n.Attrs {
        // Process attributes
    }
    return true // Keep traversing
}
로그인 후 복사

재귀를 활용하고 바닐라 XML 인코딩을 수용하면 다음과 같은 작업을 수행할 수 있습니다. 복잡한 XML 구조를 효과적으로 탐색하여 노드와 속성에 쉽게 액세스합니다.

위 내용은 XPath를 사용하지 않고 Go에서 XML 하위 항목을 효율적으로 탐색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿