1. Зачем?
В golang предусмотрена стандартная библиотека (пакет) для работы с XML файлами. Вы должны определить структуру XML и с помощью нее делать разбор (Marshaling, unmarshaling) XML fe Go by Example: XML
но, каждый раз когда вам потребуется заменить структуру XML, придется переписывать код.
или использовать универсальное решение - разбор XML в map, где ключ - это имя ноды с атрибутом, а значение - содержимое ноды.
// from ini xml to map
// parent must not contain strings only child node & parent must delimeter with LF (/n)
// каждая нода разделяется символом перевода строки
// для XML это не есть обязательное условие, но по факту для читабельности это стандарт
func parseXML2map(fname string, sibling string) {
loadXML2slice(fname, sibling) // внешняя процедура, кя просто берет XML файл и закидывает
// ветку для кй имя Parent Node = sibling
iniV := strings.Split(glSlice[1], "<")
containNode := ""
nameNode := ""
fullName := ""
ParentNode := ""
for _, val := range iniV {
containNode = ""
node := strings.Split(val, ">")
if len(node) >= 2 {
nameNode = node[0] // ParentNode + ">" +
// for safety and clear win CR symbol
// функция очищает строку от непечатных символов
// ArrByte[i] > 0 && ArrByte[i] <= 28 с 0 по 28 символ
// например, firstByte[0] == 10 - перенос строки заменяется пробелом
containNode = clearNotPrnSymbols(node[1])
containNode = strings.Trim(containNode, " ")
//fmt.Printf("i = %d, val = %s, len %d ", i, containNode, len(containNode))
}
if strings.Index(nameNode, "/") < 0 {
ParentNode = ParentNode + ">" + nameNode
//fmt.Println("parent ", ParentNode)
}
fullName = ParentNode
//fmt.Println(" fullName ", fullName)
//fmt.Println("node ", nameNode, strings.Index(nameNode, "/"))
if strings.Index(nameNode, "/") == 0 { // тэг закрывающий
tmp := strings.Split(ParentNode, ">")
tmp_last := ">" + tmp[len(tmp)-1]
ParentNode = strings.Replace(ParentNode, tmp_last, "", -1)
continue
}
glIniVariables[fullName] = containNode
} // eo for
// !!!! Iteration order is not specified and may vary from iteration to iteration. ((((((
// вывод результата
fmt.Println("out map ")
for key, value := range glIniVariables {
fmt.Println(key, "value ", value)
}
}
Пример на входе XML
<ini> <second> <sitename type="ext">http://historybookspace.rf.gd/</sitename> <header>?xml version="1.0" encoding="UTF-8"?;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" </header> <foot>urlset</foot> <structuresitemap>url;loc;absloc;sha;lastmod;size;fmode</structuresitemap> <structurebook>pagename;loc;fname;md5;dateload;size;fmode</structurebook> </second> <test> <three>test node</three> </test> </ini>
На выходе
out map
>>ini>second>sitename - name of node and his parentstype="ext" - attributehttp://historybookspace.rf.gd/ - node contains>>ini>second>sitename type="ext" value http://historybookspace.rf.gd/ >>ini>second>structurebook value pagename;loc;fname;md5;dateload;size;fmode >>ini>test value >>ini>second value >>ini value >>ini>second>header value ?xml version="1.0" encoding="UTF-8"?;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" >>ini>second>foot value urlset >>ini>second>structuresitemap value url;loc;absloc;sha;lastmod;size;fmode >>ini>test>three value test node
2. Зачем?
теперь мы получили массив (map[key, value]), по которому можно искать значения XML
в golang для поиска есть пакет Regexp, кй позволяет проводит поиск по регулярным выражениям
структуру XML мы сохранили, в значении key, где указано имя ноды и ее предки
атрибуты сохранили в значении key
содержимое ноды в value