Golang xml 키 이름 충돌

WBOY
풀어 주다: 2024-02-05 22:03:04
앞으로
688명이 탐색했습니다.

Golang xml 键名称冲突

질문 내용

다른 시스템에 로드하려면 복잡한 xml 파일을 생성해야 합니다. 따라서 태그와 태그 순서는 정확하게 로드되려면 정확한 형식을 따라야 하므로 변경할 수 없습니다. 나는 현재 이것을 달성하기 위해 golang의 인코딩/xml 패키지를 사용하고 있습니다.

제가 겪고 있는 문제는 동일한 이름을 가진 두 개의 태그를 가질 수 없다는 것입니다. 다음 오류가 발생합니다. "key" 레이블이 있는 main.XMLDict 필드 "Key1"이 "key" 레이블이 있는 "Key2" 필드와 충돌합니다. 다음은 단순화된 코드입니다.

으아악

생성해야 하는 XML 파일의 예는 다음과 같습니다.

으아악

그래서 내 질문은 다음과 같습니다. 1) 데이터를 구축한 다음 XML을 생성하는 구조적 접근 방식을 사용하여 이 문제를 해결하는 쉬운 방법이 있습니까? 2) Stuts 또는 XML을 사용하는 것보다 이 파일을 구축하고 생성하는 더 좋은 방법이 있습니까? 3) 내가 뭔가 잘못하고 있는 걸까요?

편집: 아래는 요청된 입력 파일입니다:

import (
    "fmt"
    "encoding/xml"
    "os"
)

type XMLDict struct {
    XMLName xml.Name    `xml:"dict"`
    Key1    string      `xml:"key"`
    Data1   string      `xml:"data"`
    Key2    string      `xml:"key"`
    StringArray XMLStringArray
}

type XMLStringArray struct {
    XMLName  xml.Name    `xml:"array"̀`
    XMLString   []string `xml:"string"`
}

func main() {

    sa := make([]string, 3)
    sa[0] = "g"
    sa[1] = "h"
    sa[2] = "i"

    arr := XMLStringArray{
        XMLString: sa,
    }

    master := XMLDict{
        Key1: "Color",
        Data1: "Random data",
        Key2: "Curve",
        StringArray: arr,
    }

    output, err := xml.MarshalIndent(master, "  ", "    ")
    if err != nil {
        fmt.Printf("error: %v\n", err)
    }

    os.Stdout.Write(output)

    return 
}
로그인 후 복사

정답


XML 사용자 정의 marshaller를 사용하여 이를 달성할 수 있는 솔루션이 많이 있다고 생각합니다.

우선, 루트에서는 <dict> 항상 다음과 같은 항목의 "목록"인 것 같습니다.

으아악

각각을 표현하기 위해 KeyValue 结构,其中 Value 只是一个接口来表示它可以容纳的任何内容(datainteger,...)

을 정의할 수 있습니다. 으아악

그런 다음 예제에 제공된 다양한 유형을 사용하여 이를 구현할 수 있습니다. Value:

으아악

XML 태그 안에는 chardata 用于避免在我们的 XML 文档中包含额外的级别;对于 ValueStringArray,我们使用 string 프로젝트 이름이 그렇게 지정되어 있기 때문입니다.

마지막으로 재귀(dict 内部 dict)를 허용하기 위해 다음 구조를 정의할 수도 있습니다.

으아악

모든 작업이 완료된 후 사용자 정의 마샬러를 구현할 수 있습니다.

으아악

이렇게 하면 다음과 같은 프로젝트를 생성할 수 있습니다.

으아악

태그 이름(real)基于 getXMLName() 메소드가 반환하는 내용은 다음과 같습니다.

마지막으로 Go 구조체와 마샬을 다음과 같이 정의할 수 있습니다.

으아악

이렇게 하면 질문에 제공된 예제 XML의 내용이 정확하게 인쇄됩니다.

Go Playground: https://go.dev/play/p /k8cEIywx3UB에서 전체 코드를 테스트할 수 있습니다.

이 솔루션의 주요 장점은 다음과 같습니다.

  • 사용자 정의 XML 마샬러를 구현하기만 하면 됩니다
  • XML 문서에 다른 구조가 있는 경우(부울 값이라고 가정하고 ValueBool 구현을 만들 수 있음 ValueBool 实现 Value) 쉽게 확장할 수 있습니다

위 내용은 Golang xml 키 이름 충돌의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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