Sorry, I should have been more clear.  The reason I used a slice was 
because I need an arbitrary number of elements. So I can't just use a 
static struct with the chardata tags.

On Tuesday, October 11, 2016 at 4:49:34 AM UTC-7, Konstantin Khomoutov 
wrote:
>
> On Mon, 10 Oct 2016 22:10:37 -0700 (PDT) 
> Scott <gr8w...@gmail.com <javascript:>> wrote: 
>
> > I'm trying to Marshal XML where an element has mixed content: 
> > https://www.w3.org/TR/REC-xml/#sec-mixed-content 
> > 
> > I tried just using []interface{} but if I put in just a string, 
> > Marshal surrounds each string with the name of the slice: 
> > 
> > https://play.golang.org/p/erh3mQmrZD 
> > 
> > I'm trying to get the output to be: 
> >   <root> 
> >       <element1>foo</element1> 
> >       hello 
> >       <element2>bar</element2> 
> >       world 
> >   </root> 
> > 
> > Any ideas? 
>
> Yes.  "\nhello\n" and "\nworld\n" are what is called "character data" 
> in XML parlance.  So if you go with the standard approach to marshaling 
> data to XML -- via a struct type with properly annotated fields -- 
> you should annotate the fields for your character data chunks with the 
> ",chardata" modifiers. 
>
> See the docs on encoding/xml.Marshal function for more info. 
>
> Here's a working example: 
>
> --------8<-------- 
>    package main 
>     
>    import ( 
>        "bytes" 
>        "encoding/xml" 
>        "fmt" 
>    ) 
>     
>    type E struct { 
>        XMLName struct{} `xml:"root"` 
>        E1      string   `xml:"element1"` 
>        A       string   `xml:",chardata"` 
>        E2      string   `xml:"element2"` 
>        Z       string   `xml:",chardata"` 
>    } 
>     
>    func main() { 
>        e := E{ 
>            E1: "foo", 
>            A:  "hello", 
>            E2: "bar", 
>            Z:  "world", 
>        } 
>     
>        var b bytes.Buffer 
>        enc := xml.NewEncoder(&b) 
>        enc.Indent("", "\t") 
>     
>        err := enc.Encode(&e) 
>        if err != nil { 
>            panic(err) 
>        } 
>        err = enc.Flush() 
>        if err != nil { 
>            panic(err) 
>        } 
>     
>        fmt.Println(b.String()) 
>    } 
> --------8<-------- 
>
> Playground link: <https://play.golang.org/p/pWaYmOT675> 
>
> Please note that whitespace is only insignificant in XML where *you* 
> think it is (that is, there's no inherent semantics of it in the XML 
> spec.  So you should be aware that in your example your character data 
> chunks are not "hello" and "world" but rather 
>
>   LF SP SP SP SP "hello" LF 
>
> and 
>
>   LF SP SP SP SP "world" LF 
>
> , respectively (provided linebreaks are sole LFs) 
>
> So if you really want those bits of whitespace to be present in the 
> resulting XML document you have to make sure you embed them to your 
> fields annotated with ",chardata". 
>
> Hope this helps. 
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to