为了账号安全,请及时绑定邮箱和手机立即绑定

如何解组动态 XML 数据以进行结构化?

如何解组动态 XML 数据以进行结构化?

Go
RISEBY 2022-12-19 11:54:42
我有一个 XML 数据,其中包含一些具有动态元素名称的重复数据,如下所示。<Ht><Criteria>    <ADNode_1>2</ADNode_1>    <CDNode_1>2</CDNode_1>    <IFNode_1>0</IFNode_1>    <ADNode_2>2</ADNode_2>    <CDNode_2>0</CDNode_2>    <IFNode_2>0</IFNode_2>    <ADNode_3>0</ADNode_3>    <CDNode_3>0</CDNode_3>    <IFNode_3>0</IFNode_3></Criteria><session id="1056134770841202228344907">    <Htd ID="21170">        <Data_1>            <Info Count="2"></Info>            <Data Id="iV29308/B2/R1">                <Type>TR1</Type>            </Data>            <Data Id="iV29308/B3/R1">                <Type>TR1</Type>            </Data>            <Data Id="iV29308/B4/R1">                <Type>TR1</Type>            </Data>            <Data Id="iV29308/B6/R1">                <Type>TR1</Type>            </Data>        </Data_1>        <Data_2>            <Info Count="2"></Info>            <Data Id="iV29308/B2/R1">                <Type>TR2</Type>            </Data>            <Data Id="iV29308/B3/R1">                <Type>TR2</Type>            </Data>            <Data Id="iV29308/B4/R1">                <Type>TR2</Type>            </Data>            <Data Id="iV29308/B6/R1">                <Type>TR3</Type>            </Data>        </Data_2>    </Htd></session>我可以为<ADNode_1>、<ADNode_2>和<ADNode_3>或创建单独的结构<Data_1>,<Data_2>但是可以有 n 个这样的节点。像下面一样<ADNode_1>2</ADNode_1><ADNode_2>2</ADNode_2><ADNode_3>2</ADNode_3><ADNode_n>2</ADNode_n>要么<Data_1></Data_1><Data_2></Data_2><Data_3></Data_3><Data_n></Data_n>如何为这些节点创建具有 n 个节点或元素的结构?这是我正在尝试使用的游乐场链接。
查看完整描述

1 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

通常对于这些情况,您可以在 Go 中使用切片来“收集”元素,并使用,any选项将您没有映射的所有内容放入其中。为了能够识别来源,请使用一个XMLName xml.Name字段,该字段将保留它源自的 XML 标记的名称。


例如,您可以像这样对 XML 进行建模:


type Ht struct {

    Criteria struct {

        Nodes []struct {

            XMLName xml.Name

            Content string `xml:",chardata"`

        } `xml:",any"`

    }

    Session struct {

        ID  string `xml:"id,attr"`

        Htd struct {

            ID    string `xml:"ID,attr"`

            DataX []struct {

                XMLName xml.Name

                Info    struct {

                    Count int `xml:"Count,attr"`

                }

                DataNodes []struct {

                    XMLName xml.Name

                    ID      string `xml:"Id,attr"`

                    Type    string

                } `xml:",any"`

            } `xml:",any"`

        }

    } `xml:"session"`

}

解析它并重新编码它将保留所有元素:


var ht Ht

if err := xml.Unmarshal([]byte(src), &ht); err != nil {

    panic(err)

}


result, err := xml.MarshalIndent(ht, "", "  ")

if err != nil {

    panic(err)

}


fmt.Println(string(result))

这将输出(在Go Playground上尝试):


<Ht>

  <Criteria>

    <ADNode_1>2</ADNode_1>

    <CDNode_1>2</CDNode_1>

    <IFNode_1>0</IFNode_1>

    <ADNode_2>2</ADNode_2>

    <CDNode_2>0</CDNode_2>

    <IFNode_2>0</IFNode_2>

    <ADNode_3>0</ADNode_3>

    <CDNode_3>0</CDNode_3>

    <IFNode_3>0</IFNode_3>

  </Criteria>

  <session id="1056134770841202228344907">

    <Htd ID="21170">

      <Data_1>

        <Info Count="2"></Info>

        <Data Id="iV29308/B2/R1">

          <Type>TR1</Type>

        </Data>

        <Data Id="iV29308/B3/R1">

          <Type>TR1</Type>

        </Data>

        <Data Id="iV29308/B4/R1">

          <Type>TR1</Type>

        </Data>

        <Data Id="iV29308/B6/R1">

          <Type>TR1</Type>

        </Data>

      </Data_1>

      <Data_2>

        <Info Count="2"></Info>

        <Data Id="iV29308/B2/R1">

          <Type>TR2</Type>

        </Data>

        <Data Id="iV29308/B3/R1">

          <Type>TR2</Type>

        </Data>

        <Data Id="iV29308/B4/R1">

          <Type>TR2</Type>

        </Data>

        <Data Id="iV29308/B6/R1">

          <Type>TR3</Type>

        </Data>

      </Data_2>

    </Htd>

  </session>

</Ht>



查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 173 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信