PHP Conference Nagoya 2025

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][a-z0-9+.-]*)\:\/\/@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($data, 0, 1) == "&" && substr($data, -1, 1) == ";") {
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($fp, 4096)) {
if (!
xml_parse($parser, $data, feof($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_parser, XML_OPTION_CASE_FOLDING, 1);
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($fp, 4096)) {
if (!
xml_parse($xml_parser, $data, feof($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>

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top