XML Harici Öğe Örneği

Bu örnekte XML kodu renklendirilmektedir. Bir harici öğe gönderimi eylemcisinin diğer belgeleri içermek ve çözümlemek amacıyla nasıl kullanıldığı gösterilmiştir. Bunun yanında, PI hedeflerinin ve bunları içeren kodun nasıl ele alınacağı da gösterilmiştir.

Bu örnek için kullanılan XML belgeler:

Örnek 1 - Harici Öğe Örneği

<?php
$file 
"xmltest.xml";

function 
trustedFile($file)
{
    
// sadece sahibi olduğumuz yerel dosyalara güveniyoruz
    
if (!preg_match("@^([a-z]+)\:\/\/@i"$file)
        && 
fileowner($file) == getmyuid()) {
            return 
true;
    }
    return 
false;
}

function 
startElement($parser$name$attribs)
{
    echo 
"&lt;<font color=\"#0000cc\">$name</font>";
    if (
count($attribs)) {
        foreach (
$attribs as $k => $v) {
            echo 
" <font color=\"#009900\">$k</font>=\"<font
                   color=\"#990000\">
$v</font>\"";
        }
    }
    echo 
"&gt;";
}

function 
endElement($parser$name)
{
    echo 
"&lt;/<font color=\"#0000cc\">$name</font>&gt;";
}

function 
characterData($parser$data)
{
    echo 
"<b>$data</b>";
}

function 
PIHandler($parser$target$data)
{
    switch (
strtolower($target)) {
        case 
"php":
            global 
$parser_file;
            
// Çözümlenen belge "güvenilir" ise içerdiği PHP kodu da
            // güvenilirdir diyebiliriz. Değilse, kodu göstermekle
            // yetineceğiz.
            
if (trustedFile($parser_file[$parser])) {
                eval(
$data);
            } else {
                
printf("Güvenilmez PHP kodu: <i>%s</i>",
                        
htmlspecialchars($data));
            }
            break;
    }
}

function 
defaultHandler($parser$data)
{
    if (
substr($data01) == "&" && substr($data, -11) == ";") {
        
printf('<font color="#aa00aa">%s</font>',
                
htmlspecialchars($data));
    } else {
        
printf('<font size="-1">%s</font>',
                
htmlspecialchars($data));
    }
}

function 
externalEntityRefHandler($parser$openEntityNames$base$systemId,
                                  
$publicId) {
    if (
$systemId) {
        if (!list(
$parser$fp) = new_xml_parser($systemId)) {
            
printf("%s dosyasındaki %s öğesi açılamadı\n"$systemId,
                   
$openEntityNames);
            return 
false;
        }
        while (
$data fread($fp4096)) {
            if (!
xml_parse($parser$datafeof($fp))) {
                
printf("XML hatası: %s öğesi çözümlenirken %d. satırda %s\n",
                       
$openEntityNames,
                       
xml_get_current_line_number($parser),
                       
xml_error_string(xml_get_error_code($parser));
                
xml_parser_free($parser);
                return 
false;
            }
        }
        
xml_parser_free($parser);
        return 
true;
    }
    return 
false;
}

function 
new_xml_parser($file)
{
    global 
$parser_file;

    
$xml_parser xml_parser_create();
    
xml_parser_set_option($xml_parserXML_OPTION_CASE_FOLDING1);
    
xml_set_element_handler($xml_parser"startElement""endElement");
    
xml_set_character_data_handler($xml_parser"characterData");
    
xml_set_processing_instruction_handler($xml_parser"PIHandler");
    
xml_set_default_handler($xml_parser"defaultHandler");
    
xml_set_external_entity_ref_handler($xml_parser,
              
"externalEntityRefHandler");

    if (!(
$fp = @fopen($file"r"))) {
        return 
false;
    }
    if (!
is_array($parser_file)) {
        
settype($parser_file"array");
    }
    
$parser_file[$xml_parser] = $file;
    return array(
$xml_parser$fp);
}

if (!(list(
$xml_parser$fp) = new_xml_parser($file))) {
    die(
"XML girdi açılamadı");
}

echo 
"<pre>";
while (
$data fread($fp4096)) {
    if (!
xml_parse($xml_parser$datafeof($fp))) {
        die(
sprintf("XML hatası: %d. satırda %s",
                    
xml_get_current_line_number($xml_parser)),
                    
xml_error_string(xml_get_error_code($xml_parser)));
    }
}
echo 
"</pre>";
echo 
"Çözümleme bitti\n";
xml_parser_free($xml_parser);

?>

Örnek 2 xmltest.xml

<?xml version='1.0'?>
<!DOCTYPE chapter SYSTEM "/sadece/bir/test.dtd" [
<!ENTITY plainEntity "DNM öğesi">
<!ENTITY systemEntity SYSTEM "xmltest2.xml">
]>
<chapter>
 <TITLE>&plainEntity; başlığı</TITLE>
 <para>
  <informaltable>
   <tgroup cols="3">
    <tbody>
     <row><entry>a1</entry><entry morerows="1">b1</entry><entry>c1</entry></row>
     <row><entry>a2</entry><entry>c2</entry></row>
     <row><entry>a3</entry><entry>b3</entry><entry>c3</entry></row>
    </tbody>
   </tgroup>
  </informaltable>
 </para>
 &systemEntity;
 <section id="about">
  <title>Belge hakkında/title>
  <para>
   <!-- Bu bir açıklama -->
   <?php echo 'Merhaba!  PHP sürümü: ' . phpversion(); ?>
  </para>
 </section>
</chapter>

xmltest.xml dosyasında içerilen dosya:

Örnek 3 xmltest2.xml

<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY testEnt "deneme öğesi">
]>
<foo>
   <element attrib="value"/>
   &testEnt;
   <?php echo "Burada çalıştırılacak bir PHP kodu var."; ?>
</foo>