Чтение и синтаксический анализ xml файла в golang, но без ошибок и значения «0» при печати - PullRequest
1 голос
/ 21 января 2020

Я хочу прочитать XML и использовать его для создания логики c в программе. В настоящее время я новичок в go, я могу создать структуру из файла XML, но почему-то не знаю, как печатать значения. Позже я хочу использовать это значение в качестве переменной в программе. Пожалуйста, поделитесь советами, как это сделать.

Ниже приведен файл XML, который я использую -

 <?xml version="1.0" encoding="UTF-8"?>
<rules>
<rule type="rule0">
<conditions>
   <priority>1</priority>
   <tgppmccmnc>52503</tgppmccmnc>
   <rgid>300</rgid>
   <serviceclass>null</serviceclass>
   <counterstatus0>dgu</counterstatus0>
   <counterstatus1>null</counterstatus1>
  </conditions>
  <apply>
  <chargingrulename>up_lw_normal</chargingrulename>
  <chargingrulebasename>up_lw_normal</chargingrulebasename>
   <qosinfo>
     <max_bitrate_dl>500000</max_bitrate_dl>
     <max_bitrate_ul>3000000</max_bitrate_ul>
     <qci>9</qci>
     </qosinfo>
   </apply>
    </rule>
  <rule type="rule1">
   <conditions>
   <priority>1</priority>
   <tgppmccmnc>52503</tgppmccmnc>
   <rgid>300</rgid>
   <serviceclass>null</serviceclass>
   <counterstatus0>dgu</counterstatus0>
   <counterstatus1>null</counterstatus1>
    </conditions>
   <apply>
   <chargingrulename>up_lw_normal</chargingrulename>
  <chargingrulebasename>up_lw_normal</chargingrulebasename>
   <qosinfo>
     <max_bitrate_dl>500000</max_bitrate_dl>
     <max_bitrate_ul>3000000</max_bitrate_ul>
     <qci>9</qci>
   </qosinfo>
    </apply>
   </rule>
   </rules>

Я создал следующие структуры:

package main

import (
    "encoding/xml"
)

// our struct which contains the complete array of all rules in the file
type Rules struct {
    XMLName xml.Name `xml:"rules"`
    Rules   []Rule   `xml:"rule"`
}

// the rule struct for all policy rules
type Rule struct {
    XMLName    xml.Name   `xml:"rule"`
    Type       string     `xml:"type,attr"`
    Conditions Conditions `xml:"conditions"`
    Apply      Apply      `xml:"Apply"`
    // Name string `xml:"name"`
}

// a simple struct which contains all our
// conditions
type Conditions struct {
    XMLName        xml.Name `xml:"conditions"`
    Priority       uint32   `xml:"priority"`
    Tgppmccmnc     string   `xml:"tgppmccmnc"`
    Rgid           string   `xml:"rgid"`
    Serviceclass   string   `xml:"serviceclass"`
    Counterstatus0 string   `xml:"counterstatus0"`
    Counterstatus1 string   `xml:"counterstatus1"`
}

//Apply struct //It is used for applying speed and rule to Gx response
type Apply struct {
    XMLName              xml.Name `xml:"apply"`
    Chargingrulename     string   `xml:"chargingrulename"`
    Chargingrulebasename string   `xml:"chargingrulebasename"`
    Qosinfo              Qosinfo  `xml:"qosinfo"`
}

// Apply struct for QoS speed
type Qosinfo struct {
    XMLName        xml.Name `xml:"qosinfo"`
    Max_bitrate_dl string   `xml:"max_bitrate_dl"`
    Max_bitrate_ul string   `xml:"max_bitrate_ul"`
    Qci            string   `xml:"qci"`
}

Main

xmlFile, err := os.Open("PolicyRules.xml")
// if we os.Open returns an error then handle it
if err != nil {
    fmt.Println(err)
}
fmt.Println("Successfully Opened the file")
// defer the closing of our xmlFile so that we can parse it later on
defer xmlFile.Close()
// read our opened xmlFile as a byte array.
byteValue, _ := ioutil.ReadAll(xmlFile)
// we initialize our array
var rules Rules
var rule Rule
var conditions Conditions
xml.Unmarshal(byteValue, &rules)
xml.Unmarshal(byteValue, &rule)
xml.Unmarshal(byteValue, &conditions)
fmt.Println(rule.Conditions.Priority)

Пожалуйста, помогите

1 Ответ

1 голос
/ 21 января 2020

Используйте значение ошибки xml.Unmarshal для устранения проблемы:

err = xml.Unmarshal(byteValue, &rules)

Вот ошибка:

xml: имя «Применить» в теге main.Rule.Apply конфликтует с именем «применять» в main.Apply.XMLName

Изменить Структура правила , чтобы исправить это:

// the rule struct for all policy rules
type Rule struct {
    XMLName    xml.Name   `xml:"rule"`
    Type       string     `xml:"type,attr"`
    Conditions Conditions `xml:"conditions"`
    Apply      Apply      `xml:"apply"`
    // Name string `xml:"name"`
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...