<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/xml.examples.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'example.xml-external-entity.php',
    1 => 'Exemplo de Entidade Externa XML',
    2 => 'Exemplo de Entidade Externa XML',
  ),
  'up' => 
  array (
    0 => 'xml.examples.php',
    1 => 'Exemplos',
  ),
  'prev' => 
  array (
    0 => 'example.xml-map-tags.php',
    1 => 'Exemplo de Mapeamento de Tags XML',
  ),
  'next' => 
  array (
    0 => 'example.xml-parsing-with-class.php',
    1 => 'Interpretando XML Com Classes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'reference/xml/examples.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="example.xml-external-entity" class="section">
  <h2 class="title">Exemplo de Entidade Externa XML</h2>
  <p class="para">
   Este exemplo destaca código XML. Ilustra como usar um
   manipulador de referência de entidade externa para incluir e analisar outros
   documentos, bem como como PIs podem ser processados, e uma maneira de
   determinar &quot;confiança&quot; para PIs contendo código.
  </p>
  <p class="para">
   Documentos XML que podem ser usados para este exemplo são encontrados abaixo
   do exemplo (<var class="filename">xmltest.xml</var> e
   <var class="filename">xmltest2.xml</var>).
  </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Exemplo #1 Exemplo de Entidade Externa</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$file </span><span style="color: #007700">= </span><span style="color: #DD0000">"xmltest.xml"</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">trustedFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #FF8000">// confie apenas em arquivos locais de nossa propriedade<br />    </span><span style="color: #007700">if (!</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"@^([a-z][a-z0-9+.-]*)\:\/\/@i"</span><span style="color: #007700">, </span><span style="color: #0000BB">$file</span><span style="color: #007700">)<br />        &amp;&amp; </span><span style="color: #0000BB">fileowner</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">) == </span><span style="color: #0000BB">getmyuid</span><span style="color: #007700">()) {<br />            return </span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />    }<br />    return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">startElement</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$name</span><span style="color: #007700">, </span><span style="color: #0000BB">$attribs</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #DD0000">"&amp;lt;&lt;font color=\"#0000cc\"&gt;</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">&lt;/font&gt;"</span><span style="color: #007700">;<br />    if (</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$attribs</span><span style="color: #007700">)) {<br />        foreach (</span><span style="color: #0000BB">$attribs </span><span style="color: #007700">as </span><span style="color: #0000BB">$k </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$v</span><span style="color: #007700">) {<br />            echo </span><span style="color: #DD0000">" &lt;font color=\"#009900\"&gt;</span><span style="color: #0000BB">$k</span><span style="color: #DD0000">&lt;/font&gt;=\"&lt;font<br />                   color=\"#990000\"&gt;</span><span style="color: #0000BB">$v</span><span style="color: #DD0000">&lt;/font&gt;\""</span><span style="color: #007700">;<br />        }<br />    }<br />    echo </span><span style="color: #DD0000">"&amp;gt;"</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">endElement</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$name</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #DD0000">"&amp;lt;/&lt;font color=\"#0000cc\"&gt;</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">&lt;/font&gt;&amp;gt;"</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">characterData</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #DD0000">"&lt;b&gt;</span><span style="color: #0000BB">$data</span><span style="color: #DD0000">&lt;/b&gt;"</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">PIHandler</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$target</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">)<br />{<br />    switch (</span><span style="color: #0000BB">strtolower</span><span style="color: #007700">(</span><span style="color: #0000BB">$target</span><span style="color: #007700">)) {<br />        case </span><span style="color: #DD0000">"php"</span><span style="color: #007700">:<br />            global </span><span style="color: #0000BB">$parser_file</span><span style="color: #007700">;<br />            </span><span style="color: #FF8000">// Se o documento analisado for "confiável", dizemos que é seguro<br />            // para executar o código PHP dentro dele. Caso contrário, exiba o código<br />            // em vez disso.<br />            </span><span style="color: #007700">if (</span><span style="color: #0000BB">trustedFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser_file</span><span style="color: #007700">[</span><span style="color: #0000BB">$parser</span><span style="color: #007700">])) {<br />                eval(</span><span style="color: #0000BB">$data</span><span style="color: #007700">);<br />            } else {<br />                </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Código PHP não confiável: &lt;i&gt;%s&lt;/i&gt;"</span><span style="color: #007700">,<br />                        </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">));<br />            }<br />            break;<br />    }<br />}<br /><br />function </span><span style="color: #0000BB">defaultHandler</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">)<br />{<br />    if (</span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">) == </span><span style="color: #DD0000">"&amp;" </span><span style="color: #007700">&amp;&amp; </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, -</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">) == </span><span style="color: #DD0000">";"</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">'&lt;font color="#aa00aa"&gt;%s&lt;/font&gt;'</span><span style="color: #007700">,<br />                </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">));<br />    } else {<br />        </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">'&lt;font size="-1"&gt;%s&lt;/font&gt;'</span><span style="color: #007700">,<br />                </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">));<br />    }<br />}<br /><br />function </span><span style="color: #0000BB">externalEntityRefHandler</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$openEntityNames</span><span style="color: #007700">, </span><span style="color: #0000BB">$base</span><span style="color: #007700">, </span><span style="color: #0000BB">$systemId</span><span style="color: #007700">,<br />                                  </span><span style="color: #0000BB">$publicId</span><span style="color: #007700">) {<br />    if (</span><span style="color: #0000BB">$systemId</span><span style="color: #007700">) {<br />        if (!list(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$fp</span><span style="color: #007700">) = </span><span style="color: #0000BB">new_xml_parser</span><span style="color: #007700">(</span><span style="color: #0000BB">$systemId</span><span style="color: #007700">)) {<br />            </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Não foi possível abrir a entidade %s em %s\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$openEntityNames</span><span style="color: #007700">,<br />                   </span><span style="color: #0000BB">$systemId</span><span style="color: #007700">);<br />            return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />        }<br />        while (</span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">4096</span><span style="color: #007700">)) {<br />            if (!</span><span style="color: #0000BB">xml_parse</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">feof</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">))) {<br />                </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Erro XML: %s na linha %d ao analisar a entidade %s\n"</span><span style="color: #007700">,<br />                       </span><span style="color: #0000BB">xml_error_string</span><span style="color: #007700">(</span><span style="color: #0000BB">xml_get_error_code</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">)),<br />                       </span><span style="color: #0000BB">xml_get_current_line_number</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">), </span><span style="color: #0000BB">$openEntityNames</span><span style="color: #007700">);<br />                return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />            }<br />        }<br />        return </span><span style="color: #0000BB">true</span><span style="color: #007700">;<br />    }<br />    return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">new_xml_parser</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">)<br />{<br />    global </span><span style="color: #0000BB">$parser_file</span><span style="color: #007700">;<br /><br />    </span><span style="color: #0000BB">$xml_parser </span><span style="color: #007700">= </span><span style="color: #0000BB">xml_parser_create</span><span style="color: #007700">();<br />    </span><span style="color: #0000BB">xml_parser_set_option</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #0000BB">XML_OPTION_CASE_FOLDING</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">xml_set_element_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #DD0000">"startElement"</span><span style="color: #007700">, </span><span style="color: #DD0000">"endElement"</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">xml_set_character_data_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #DD0000">"characterData"</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">xml_set_processing_instruction_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #DD0000">"PIHandler"</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">xml_set_default_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #DD0000">"defaultHandler"</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">xml_set_external_entity_ref_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #DD0000">"externalEntityRefHandler"</span><span style="color: #007700">);<br /><br />    if (!(</span><span style="color: #0000BB">$fp </span><span style="color: #007700">= @</span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">, </span><span style="color: #DD0000">"r"</span><span style="color: #007700">))) {<br />        return </span><span style="color: #0000BB">false</span><span style="color: #007700">;<br />    }<br />    if (!</span><span style="color: #0000BB">is_array</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser_file</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">settype</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser_file</span><span style="color: #007700">, </span><span style="color: #DD0000">"array"</span><span style="color: #007700">);<br />    }<br />    </span><span style="color: #0000BB">$parser_file</span><span style="color: #007700">[</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">] = </span><span style="color: #0000BB">$file</span><span style="color: #007700">;<br />    return array(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$fp</span><span style="color: #007700">);<br />}<br /><br />if (!(list(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$fp</span><span style="color: #007700">) = </span><span style="color: #0000BB">new_xml_parser</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">))) {<br />    die(</span><span style="color: #DD0000">"não foi possível abrir a entrada XML"</span><span style="color: #007700">);<br />}<br /><br />echo </span><span style="color: #DD0000">"&lt;pre&gt;"</span><span style="color: #007700">;<br />while (</span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">fread</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">, </span><span style="color: #0000BB">4096</span><span style="color: #007700">)) {<br />    if (!</span><span style="color: #0000BB">xml_parse</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">feof</span><span style="color: #007700">(</span><span style="color: #0000BB">$fp</span><span style="color: #007700">))) {<br />        die(</span><span style="color: #0000BB">sprintf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Erro XML: %s na linha %d\n"</span><span style="color: #007700">,<br />                    </span><span style="color: #0000BB">xml_error_string</span><span style="color: #007700">(</span><span style="color: #0000BB">xml_get_error_code</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">)),<br />                    </span><span style="color: #0000BB">xml_get_current_line_number</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml_parser</span><span style="color: #007700">)));<br />    }<br />}<br />echo </span><span style="color: #DD0000">"&lt;/pre&gt;"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"análise concluída\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Exemplo #2 xmltest.xml</strong></p>
    <div class="example-contents">
<div class="annotation-interactive xmlcode"><pre class="xmlcode">&lt;?xml version=&#039;1.0&#039;?&gt;
&lt;!DOCTYPE chapter SYSTEM &quot;/just/a/test.dtd&quot; [
&lt;!ENTITY plainEntity &quot;FOO entity&quot;&gt;
&lt;!ENTITY systemEntity SYSTEM &quot;xmltest2.xml&quot;&gt;
]&gt;
&lt;chapter&gt;
 &lt;TITLE&gt;Título &amp;plainEntity;&lt;/TITLE&gt;
 &lt;para&gt;
  &lt;informaltable&gt;
   &lt;tgroup cols=&quot;3&quot;&gt;
    &lt;tbody&gt;
     &lt;row&gt;&lt;entry&gt;a1&lt;/entry&gt;&lt;entry morerows=&quot;1&quot;&gt;b1&lt;/entry&gt;&lt;entry&gt;c1&lt;/entry&gt;&lt;/row&gt;
     &lt;row&gt;&lt;entry&gt;a2&lt;/entry&gt;&lt;entry&gt;c2&lt;/entry&gt;&lt;/row&gt;
     &lt;row&gt;&lt;entry&gt;a3&lt;/entry&gt;&lt;entry&gt;b3&lt;/entry&gt;&lt;entry&gt;c3&lt;/entry&gt;&lt;/row&gt;
    &lt;/tbody&gt;
   &lt;/tgroup&gt;
  &lt;/informaltable&gt;
 &lt;/para&gt;
 &amp;systemEntity;
 &lt;section id=&quot;about&quot;&gt;
  &lt;title&gt;Sobre este documento&lt;/title&gt;
  &lt;para&gt;
   &lt;!-- isto é um comentário --&gt;
   &lt;?php echo &#039;Oi! Esta é a versão PHP&#039; . phpversion(); ?&gt;
  &lt;/para&gt;
 &lt;/section&gt;
&lt;/chapter&gt;</pre>
</div>
    </div>

   </div>
  </p>
  <p class="para">
   Este arquivo é incluído de <var class="filename">xmltest.xml</var>:
   <div class="example" id="example-3">
    <p><strong>Exemplo #3 xmltest2.xml</strong></p>
    <div class="example-contents">
<div class="annotation-interactive xmlcode"><pre class="xmlcode">&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;!DOCTYPE foo [
&lt;!ENTITY testEnt &quot;test entity&quot;&gt;
]&gt;
&lt;foo&gt;
   &lt;element attrib=&quot;value&quot;/&gt;
   &amp;testEnt;
   &lt;?php echo &quot;Este é mais um código PHP sendo executado.&quot;; ?&gt;
&lt;/foo&gt;</pre>
</div>
    </div>

   </div>
  </p>
 </div><?php manual_footer($setup); ?>