<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Go by Example: XML</title>
    <link rel=stylesheet href="site.css">
  </head>
  <script>
      window.onkeydown = (e) => {
          if (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) {
              return;
          }
          
          if (e.key == "ArrowLeft") {
              window.location.href = 'json';
          }
          
          
          if (e.key == "ArrowRight") {
              window.location.href = 'time';
          }
          
      }
  </script>
  <body>
    <div class="example" id="xml">
      <h2><a href="./">Go by Example</a>: XML <button id="theme-toggle" title="Cambia tema"><span id="theme-icon">🌙</span></button></h2>
      
      <table>
        
        <tr>
          <td class="docs">
            <p>Go offre supporto integrato per XML e formati
simili a XML con il pacchetto <code>encoding/xml</code>.</p>

          </td>
          <td class="code empty leading">
            
          
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            
          </td>
          <td class="code leading">
            <a href="https://go.dev/play/p/y7oqKgKKm1K"><img title="Esegui codice" src="play.png" class="run" /></a><img title="Copia codice" src="clipboard.png" class="copy" />
          <pre class="chroma"><code><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            
          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;encoding/xml&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s">&#34;fmt&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            <p>Plant sarà mappato a XML. Similmente agli
esempi JSON, i tag dei campi contengono direttive per
encoder e decoder. Qui usiamo alcune funzionalità speciali
del pacchetto XML: il nome del campo <code>XMLName</code> detta
il nome dell&rsquo;elemento XML che rappresenta questo struct;
<code>id,attr</code> significa che il campo <code>Id</code> è un
<em>attributo</em> XML piuttosto che un elemento annidato.</p>

          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Plant</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">XMLName</span> <span class="nx">xml</span><span class="p">.</span><span class="nx">Name</span> <span class="s">`xml:&#34;plant&#34;`</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Id</span>      <span class="kt">int</span>      <span class="s">`xml:&#34;id,attr&#34;`</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Name</span>    <span class="kt">string</span>   <span class="s">`xml:&#34;name&#34;`</span>
</span></span><span class="line"><span class="cl">    <span class="nx">Origin</span>  <span class="p">[]</span><span class="kt">string</span> <span class="s">`xml:&#34;origin&#34;`</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            
          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl"><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="nx">Plant</span><span class="p">)</span> <span class="nf">String</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Sprintf</span><span class="p">(</span><span class="s">&#34;Plant id=%v, name=%v, origin=%v&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="nx">p</span><span class="p">.</span><span class="nx">Id</span><span class="p">,</span> <span class="nx">p</span><span class="p">.</span><span class="nx">Name</span><span class="p">,</span> <span class="nx">p</span><span class="p">.</span><span class="nx">Origin</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            
          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nx">coffee</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">Plant</span><span class="p">{</span><span class="nx">Id</span><span class="p">:</span> <span class="mi">27</span><span class="p">,</span> <span class="nx">Name</span><span class="p">:</span> <span class="s">&#34;Coffee&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">coffee</span><span class="p">.</span><span class="nx">Origin</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Ethiopia&#34;</span><span class="p">,</span> <span class="s">&#34;Brazil&#34;</span><span class="p">}</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            <p>Emette XML che rappresenta la nostra pianta; usando
<code>MarshalIndent</code> per produrre un output
più leggibile dall&rsquo;uomo.</p>

          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl">    <span class="nx">out</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">xml</span><span class="p">.</span><span class="nf">MarshalIndent</span><span class="p">(</span><span class="nx">coffee</span><span class="p">,</span> <span class="s">&#34; &#34;</span><span class="p">,</span> <span class="s">&#34;  &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">out</span><span class="p">))</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            <p>Per aggiungere un header XML generico all&rsquo;output, aggiungilo
esplicitamente.</p>

          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">xml</span><span class="p">.</span><span class="nx">Header</span> <span class="o">+</span> <span class="nb">string</span><span class="p">(</span><span class="nx">out</span><span class="p">))</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            <p>Usa <code>Unmarshal</code> per parsare un flusso di byte con XML
in una struttura dati. Se l&rsquo;XML è malformato o
non può essere mappato su Plant, sarà restituito
un errore descrittivo.</p>

          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl">    <span class="kd">var</span> <span class="nx">p</span> <span class="nx">Plant</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">xml</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">out</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">p</span><span class="p">);</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">p</span><span class="p">)</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            
          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl">    <span class="nx">tomato</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">Plant</span><span class="p">{</span><span class="nx">Id</span><span class="p">:</span> <span class="mi">81</span><span class="p">,</span> <span class="nx">Name</span><span class="p">:</span> <span class="s">&#34;Tomato&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">tomato</span><span class="p">.</span><span class="nx">Origin</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Mexico&#34;</span><span class="p">,</span> <span class="s">&#34;California&#34;</span><span class="p">}</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            <p>Il tag del campo <code>parent&gt;child&gt;plant</code> dice all&rsquo;encoder
di annidare tutti i <code>plant</code> sotto <code>&lt;parent&gt;&lt;child&gt;...</code></p>

          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl">    <span class="kd">type</span> <span class="nx">Nesting</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">XMLName</span> <span class="nx">xml</span><span class="p">.</span><span class="nx">Name</span> <span class="s">`xml:&#34;nesting&#34;`</span>
</span></span><span class="line"><span class="cl">        <span class="nx">Plants</span>  <span class="p">[]</span><span class="o">*</span><span class="nx">Plant</span> <span class="s">`xml:&#34;parent&gt;child&gt;plant&#34;`</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            
          </td>
          <td class="code leading">
            
          <pre class="chroma"><code><span class="line"><span class="cl">    <span class="nx">nesting</span> <span class="o">:=</span> <span class="o">&amp;</span><span class="nx">Nesting</span><span class="p">{}</span>
</span></span><span class="line"><span class="cl">    <span class="nx">nesting</span><span class="p">.</span><span class="nx">Plants</span> <span class="p">=</span> <span class="p">[]</span><span class="o">*</span><span class="nx">Plant</span><span class="p">{</span><span class="nx">coffee</span><span class="p">,</span> <span class="nx">tomato</span><span class="p">}</span></span></span></code></pre>
          </td>
        </tr>
        
        <tr>
          <td class="docs">
            
          </td>
          <td class="code">
            
          <pre class="chroma"><code><span class="line"><span class="cl">    <span class="nx">out</span><span class="p">,</span> <span class="nx">_</span> <span class="p">=</span> <span class="nx">xml</span><span class="p">.</span><span class="nf">MarshalIndent</span><span class="p">(</span><span class="nx">nesting</span><span class="p">,</span> <span class="s">&#34; &#34;</span><span class="p">,</span> <span class="s">&#34;  &#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nb">string</span><span class="p">(</span><span class="nx">out</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre>
          </td>
        </tr>
        
      </table>
      
      <table>
        
        <tr>
          <td class="docs">
            
          </td>
          <td class="code">
            
          <pre class="chroma"><code><span class="line"><span class="cl"><span class="gp">$</span> go run xml.go
</span></span><span class="line"><span class="cl"><span class="go"> &lt;plant id=&#34;27&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">   &lt;name&gt;Coffee&lt;/name&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">   &lt;origin&gt;Ethiopia&lt;/origin&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">   &lt;origin&gt;Brazil&lt;/origin&gt;
</span></span></span><span class="line"><span class="cl"><span class="go"> &lt;/plant&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;
</span></span></span><span class="line"><span class="cl"><span class="go"> &lt;plant id=&#34;27&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">   &lt;name&gt;Coffee&lt;/name&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">   &lt;origin&gt;Ethiopia&lt;/origin&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">   &lt;origin&gt;Brazil&lt;/origin&gt;
</span></span></span><span class="line"><span class="cl"><span class="go"> &lt;/plant&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">Plant id=27, name=Coffee, origin=[Ethiopia Brazil]
</span></span></span><span class="line"><span class="cl"><span class="go"> &lt;nesting&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">   &lt;parent&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">     &lt;child&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">       &lt;plant id=&#34;27&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">         &lt;name&gt;Coffee&lt;/name&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">         &lt;origin&gt;Ethiopia&lt;/origin&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">         &lt;origin&gt;Brazil&lt;/origin&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">       &lt;/plant&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">       &lt;plant id=&#34;81&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">         &lt;name&gt;Tomato&lt;/name&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">         &lt;origin&gt;Mexico&lt;/origin&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">         &lt;origin&gt;California&lt;/origin&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">       &lt;/plant&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">     &lt;/child&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">   &lt;/parent&gt;
</span></span></span><span class="line"><span class="cl"><span class="go"> &lt;/nesting&gt;</span></span></span></code></pre>
          </td>
        </tr>
        
      </table>
      
      
      <p class="next">
        Prossimo esempio: <a href="time" rel="next">Time</a>.
      </p>
      

    <p class="footer">
      di <a href="https://markmcgranaghan.com">Mark McGranaghan</a> e <a href="https://eli.thegreenplace.net">Eli Bendersky</a><br>
      traduzione di <a href="https://andrearaponi.it">Andrea Raponi</a> | <a href="https://github.com/andrearaponi/gobyexample-it">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a>
    </p>

    </div>
    <script>
      var codeLines = [];
      codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import (\u000A    \"encoding/xml\"\u000A    \"fmt\"\u000A)\u000A');codeLines.push('type Plant struct {\u000A    XMLName xml.Name `xml:\"plant\"`\u000A    Id      int      `xml:\"id,attr\"`\u000A    Name    string   `xml:\"name\"`\u000A    Origin  []string `xml:\"origin\"`\u000A}\u000A');codeLines.push('func (p Plant) String() string {\u000A    return fmt.Sprintf(\"Plant id\u003D%v, name\u003D%v, origin\u003D%v\",\u000A        p.Id, p.Name, p.Origin)\u000A}\u000A');codeLines.push('func main() {\u000A    coffee :\u003D \u0026Plant{Id: 27, Name: \"Coffee\"}\u000A    coffee.Origin \u003D []string{\"Ethiopia\", \"Brazil\"}\u000A');codeLines.push('    out, _ :\u003D xml.MarshalIndent(coffee, \" \", \"  \")\u000A    fmt.Println(string(out))\u000A');codeLines.push('    fmt.Println(xml.Header + string(out))\u000A');codeLines.push('    var p Plant\u000A    if err :\u003D xml.Unmarshal(out, \u0026p); err !\u003D nil {\u000A        panic(err)\u000A    }\u000A    fmt.Println(p)\u000A');codeLines.push('    tomato :\u003D \u0026Plant{Id: 81, Name: \"Tomato\"}\u000A    tomato.Origin \u003D []string{\"Mexico\", \"California\"}\u000A');codeLines.push('    type Nesting struct {\u000A        XMLName xml.Name `xml:\"nesting\"`\u000A        Plants  []*Plant `xml:\"parent\u003Echild\u003Eplant\"`\u000A    }\u000A');codeLines.push('    nesting :\u003D \u0026Nesting{}\u000A    nesting.Plants \u003D []*Plant{coffee, tomato}\u000A');codeLines.push('    out, _ \u003D xml.MarshalIndent(nesting, \" \", \"  \")\u000A    fmt.Println(string(out))\u000A}\u000A');codeLines.push('');
    </script>
    <script src="site.js" async></script>
  </body>
</html>
