20

I have an XML structure like this:

<RootLevel status="new" timestamp="1383259529" xmlns="http://someplace.com">
    <Item active="1" status="new" itemid="451254">
        <SubItem active="1" recent="false" usertext="No idea" id="78421">
            <SubItemField active="1" ready="no" type="1">1.4</SubItemField>
            <SubItemField active="1" ready="yes" type="2">4.5</SubItemField>
        </SubItem>
    </Item>
</RootLevel>

I don't know how I can gather both values and attributes for the SubItemField elements, my code is something like:

type RootLEvel struct {
    XMLName xml.Name `xml:"RootLevel"`
    ...
    Item    []Item
}

type Item struct {
    ...
    SubItem   []SubItem
}

type SubItem struct {
    ...
    SubItemField    []SubItemField
}

type SubItemField struct {
    Active bool `xml:"active,attr"`
    Ready string `xml:"ready,attr"`
}

I need both attributes and values but the only way to get values that I know is just use

SubItemField  []float32

instead of my custom type. I am using xml.Unmarshal btw.

Any idea?

Thanks.

DamnWidget
  • 1,397
  • 2
  • 10
  • 16

1 Answers1

50

I figured myself how to do that, I had simply to add a new property in my struct that match xml:",chardata" so it looks like:

type SubItemField struct {
    Value  float32 `xml:",chardata"`
    Active bool    `xml:"active,attr"`
    Ready  string  `xml:"ready,attr"`
}

I hope that can help someone cos there is no documentation or examples about this.

DamnWidget
  • 1,397
  • 2
  • 10
  • 16
  • From the Godocs for encoding/xml: `- a field with tag ",chardata" is written as character data, not as an XML element.` – Sam Whited Dec 22 '14 at 03:33
  • 1
    To avoid confusion and clarify @SamWhited 's comment... ",chardata" simply refers to the internal character data of the xml element, hence when writing to xml the data is just written into the element as characters, and when being read from the xml it is simple read as characters. The data type being written from or read into doesn't matter so long as the data can be coerced into that type. – Justin Ohms Sep 12 '17 at 16:59
  • Thanks, in retrospect that was confusing. I was just trying to point out that "there is no documentation" was an incorrect statement, it is documented in the encoding/xml package. – Sam Whited Sep 12 '17 at 20:48