Я новичок в Go и пытаюсь проверить XML, но не могу. Ниже я пробовал, но это не работает. Есть ли способ это сделать.
func ParseXml(xml_path string) {
xmlFile, err := os.Open(xml_path)
if err != nil {
panic(err)
}
// defer the closing of our xmlFile so that we can parse it later on
defer xmlFile.Close()
// read our opened xmlFile1 as a byte array. here I am checking if the file is valid or not
byteValue, err := ioutil.ReadAll(xmlFile)
if err != nil {
panic(fmt.Sprintf("%s file reading failed \n",xml_path))
}
}
Хотя я передаю неверный XML-файл, но я не паникую после
byteValue, err := ioutil.ReadAll(xmlFile)





Ваш код не проверяет синтаксис XML. Ваш код читает файл независимо от того, что он делает. Самый простой способ проверить XML - использовать пакет xml.
func IsValidXML(data []byte) bool {
return xml.Unmarshal(data, new(interface{})) == nil
}
Итак, что касается вашего кода, он должен выглядеть так:
func ParseXml(xml_path string) {
xmlFile, err := os.Open(xml_path)
if err != nil {
panic(err)
}
// defer the closing of our xmlFile so that we can parse it later on
defer xmlFile.Close()
// read our opened xmlFile1 as a byte array. here I am checking if the file is valid or not
byteValue, err := ioutil.ReadAll(xmlFile)
if err != nil {
panic(fmt.Sprintf("%s file reading failed \n",xml_path))
}
if !IsValidXML(byteValue) {
panic("Invalid XML has been input")
}
}
Для документации xml.Unmarshal посетите https://golang.org/pkg/encoding/xml/#Unmarshal
Я думаю, что это ошибка в функции IsValidXML() выше; это должен быть ==
Обратите внимание, что это в лучшем случае проверка того, является ли документ «правильно сформированным» XML. Валидация обычно относится к процессу проверки того, соответствует ли документ схеме.
@ EB2127 правда, у меня проблема с условиями ngl lol
К сожалению, вы не можете просто использовать xml.Unmarshal, потому что это останавливает синтаксический анализ после закрытия первого элемента. Пример:
func IsValid(s string) bool {
return xml.Unmarshal([]byte(s), new(interface{})) == nil
}
func main() {
// Prints "true".
fmt.Println(IsValid("<foo></foo><<<<<<<"))
}
Однако вы можете многократно декодировать элементы, пока не возникнет ошибка, отличная от io.EOF:
func IsValid(input string) bool {
decoder := xml.NewDecoder(strings.NewReader(input))
for {
err := decoder.Decode(new(interface{}))
if err != nil {
return err == io.EOF
}
}
}
Пожалуйста, включите все соответствующие сообщения об ошибках. Если вы не получаете сообщение об ошибке, какой результат вы ожидаете и что вы видите вместо этого?