다른 시스템에 로드하려면 복잡한 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를 사용하여 이를 달성할 수 있는 솔루션이 많이 있다고 생각합니다.
우선, 루트에서는 009c9cf71eed486d4d9be08f8b55d0a7
항상 다음과 같은 항목의 "목록"인 것 같습니다.
각각을 표현하기 위해 KeyValue
结构,其中 Value
只是一个接口来表示它可以容纳的任何内容(data
,integer
,...)
그런 다음 예제에 제공된 다양한 유형을 사용하여 이를 구현할 수 있습니다. Value
:
XML 태그 안에는 chardata
用于避免在我们的 XML 文档中包含额外的级别;对于 ValueStringArray
,我们使用 string
프로젝트 이름이 그렇게 지정되어 있기 때문입니다.
마지막으로 재귀(dict
内部 dict
)를 허용하기 위해 다음 구조를 정의할 수도 있습니다.
모든 작업이 완료된 후 사용자 정의 마샬러를 구현할 수 있습니다.
으아악이렇게 하면 다음과 같은 프로젝트를 생성할 수 있습니다.
으아악태그 이름(real
)基于 getXMLName()
메소드가 반환하는 내용은 다음과 같습니다.
마지막으로 Go 구조체와 마샬을 다음과 같이 정의할 수 있습니다.
으아악이렇게 하면 질문에 제공된 예제 XML의 내용이 정확하게 인쇄됩니다.
Go Playground: https://go.dev/play/p /k8cEIywx3UB에서 전체 코드를 테스트할 수 있습니다.
이 솔루션의 주요 장점은 다음과 같습니다.
ValueBool
구현을 만들 수 있음 ValueBool
实现 Value
) 쉽게 확장할 수 있습니다 위 내용은 Golang xml 키 이름 충돌의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!