On Mon, 10 Oct 2016 22:10:37 -0700 (PDT)
Scott <gr8whi...@gmail.com> 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