<?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 => 'en',
  ),
  'this' => 
  array (
    0 => 'example.xml-external-entity.php',
    1 => 'XML External Entity Example',
    2 => 'XML External Entity Example',
  ),
  'up' => 
  array (
    0 => 'xml.examples.php',
    1 => 'Examples',
  ),
  'prev' => 
  array (
    0 => 'example.xml-map-tags.php',
    1 => 'XML Tag Mapping Example',
  ),
  'next' => 
  array (
    0 => 'example.xml-parsing-with-class.php',
    1 => 'XML Parsing With Class',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'en',
    '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">XML External Entity Example</h2>
  <p class="para">
   This example highlights XML code.  It illustrates how to use an
   external entity reference handler to include and parse other
   documents, as well as how PIs can be processed, and a way of
   determining &quot;trust&quot; for PIs containing code.
  </p>
  <p class="para">
   XML documents that can be used for this example are found below
   the example (<var class="filename">xmltest.xml</var> and
   <var class="filename">xmltest2.xml</var>.)
  </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Example #1 External Entity Example</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
$file </span><span style="color: #007700">= </span><span style="color: #DD0000">"xmltest.xml"</span><span style="color: #007700">;

function </span><span style="color: #0000BB">trustedFile</span><span style="color: #007700">(</span><span style="color: #0000BB">$file</span><span style="color: #007700">)
{
    </span><span style="color: #FF8000">// only trust local files owned by ourselves
    </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">)
        &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">()) {
            return </span><span style="color: #0000BB">true</span><span style="color: #007700">;
    }
    return </span><span style="color: #0000BB">false</span><span style="color: #007700">;
}

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">)
{
    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">;
    if (</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$attribs</span><span style="color: #007700">)) {
        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">) {
            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
                   color=\"#990000\"&gt;</span><span style="color: #0000BB">$v</span><span style="color: #DD0000">&lt;/font&gt;\""</span><span style="color: #007700">;
        }
    }
    echo </span><span style="color: #DD0000">"&amp;gt;"</span><span style="color: #007700">;
}

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">)
{
    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">;
}

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">)
{
    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">;
}

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">)
{
    switch (</span><span style="color: #0000BB">strtolower</span><span style="color: #007700">(</span><span style="color: #0000BB">$target</span><span style="color: #007700">)) {
        case </span><span style="color: #DD0000">"php"</span><span style="color: #007700">:
            global </span><span style="color: #0000BB">$parser_file</span><span style="color: #007700">;
            </span><span style="color: #FF8000">// If the parsed document is "trusted", we say it is safe
            // to execute PHP code inside it.  If not, display the code
            // instead.
            </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">])) {
                eval(</span><span style="color: #0000BB">$data</span><span style="color: #007700">);
            } else {
                </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Untrusted PHP code: &lt;i&gt;%s&lt;/i&gt;"</span><span style="color: #007700">,
                        </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">));
            }
            break;
    }
}

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">)
{
    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">) {
        </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">,
                </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">));
    } else {
        </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">,
                </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">));
    }
}

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">,
                                  </span><span style="color: #0000BB">$publicId</span><span style="color: #007700">) {
    if (</span><span style="color: #0000BB">$systemId</span><span style="color: #007700">) {
        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">)) {
            </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"Could not open entity %s at %s\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">$openEntityNames</span><span style="color: #007700">,
                   </span><span style="color: #0000BB">$systemId</span><span style="color: #007700">);
            return </span><span style="color: #0000BB">false</span><span style="color: #007700">;
        }
        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">)) {
            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">))) {
                </span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"XML error: %s at line %d while parsing entity %s\n"</span><span style="color: #007700">,
                       </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">)),
                       </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">);
                return </span><span style="color: #0000BB">false</span><span style="color: #007700">;
            }
        }
        return </span><span style="color: #0000BB">true</span><span style="color: #007700">;
    }
    return </span><span style="color: #0000BB">false</span><span style="color: #007700">;
}

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">)
{
    global </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">xml_parser_create</span><span style="color: #007700">();
    </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">);
    </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">);
    </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">);
    </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">);
    </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">);
    </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">);

    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">))) {
        return </span><span style="color: #0000BB">false</span><span style="color: #007700">;
    }
    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">)) {
        </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">);
    }
    </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">;
    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">);
}

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">))) {
    die(</span><span style="color: #DD0000">"could not open XML input"</span><span style="color: #007700">);
}

echo </span><span style="color: #DD0000">"&lt;pre&gt;"</span><span style="color: #007700">;
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">)) {
    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">))) {
        die(</span><span style="color: #0000BB">sprintf</span><span style="color: #007700">(</span><span style="color: #DD0000">"XML error: %s at line %d\n"</span><span style="color: #007700">,
                    </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">)),
                    </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">)));
    }
}
echo </span><span style="color: #DD0000">"&lt;/pre&gt;"</span><span style="color: #007700">;
echo </span><span style="color: #DD0000">"parse complete\n"</span><span style="color: #007700">;

</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Example #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;Title &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;About this Document&lt;/title&gt;
  &lt;para&gt;
   &lt;!-- this is a comment --&gt;
   &lt;?php echo &#039;Hi!  This is PHP version &#039; . phpversion(); ?&gt;
  &lt;/para&gt;
 &lt;/section&gt;
&lt;/chapter&gt;</pre>
</div>
    </div>

   </div>
  </p>
  <p class="para">
   This file is included from <var class="filename">xmltest.xml</var>:
   <div class="example" id="example-3">
    <p><strong>Example #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;This is some more PHP code being executed.&quot;; ?&gt;
&lt;/foo&gt;</pre>
</div>
    </div>

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