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 중국어 웹사이트의 기타 관련 기사를 참조하세요!