1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
archived-doc-ru/reference/xml/examples.xml

422 lines
12 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: b47e4bea197126359815c5e43403c4b77a0aaaa7 Maintainer: mch Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="xml.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<section xml:id="example.xml-structure">
<title>Пример Структуры Элемента XML</title>
<para>
Первый пример отображает структуру начальных элементов в документе
с отступом.
<example>
<title>Показать структуру элемента XML</title>
<programlisting role="php">
<![CDATA[
<?php
$file = "examples/book.xml";
$depth = 0;
function startElement($parser, $name, $attrs)
{
global $depth;
for ($i = 0; $i < $depth; $i++) {
echo " ";
}
echo "$name\n";
$depth++;
}
function endElement($parser, $name)
{
global $depth;
$depth--;
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
die("Невозможно произвести чтение XML");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("Ошибка XML: %s на строке %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
?>
]]>
</programlisting>
</example>
</para>
</section>
<section xml:id="example.xml-map-tags">
<title>Пример отображения XML тегов</title>
<para>
<example>
<title>Отображение XML в HTML</title>
<para>
Этот пример отображает теги XML документа непосредственно в HTML тегах.
Элементы не найденные в "массиве отображения" игнорируются. Конечно,
этот пример будет работать только с определённым типом документа XML.
</para>
<programlisting role="php">
<![CDATA[
<?php
$file = "examples/book.xml";
$map_array = array(
"BOLD" => "B",
"EMPHASIS" => "I",
"LITERAL" => "TT"
);
function startElement($parser, $name, $attrs)
{
global $map_array;
if (isset($map_array[$name])) {
echo "<$map_array[$name]>";
}
}
function endElement($parser, $name)
{
global $map_array;
if (isset($map_array[$name])) {
echo "</$map_array[$name]>";
}
}
function characterData($parser, $data)
{
echo $data;
}
$xml_parser = xml_parser_create();
// используется преобразование регистра, чтобы гарантированно найти тег в $map_array
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("Невозможно произвести чтение XML");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
?>
]]>
</programlisting>
</example>
</para>
</section>
<section xml:id="example.xml-external-entity">
<title>Пример использования внешних сущностей XML</title>
<para>
Этот пример подсвечивает код XML. Он иллюстрирует то, как необходимо
использовать обработчик ссылки на внешнюю сущность для подключения и
разбора содержимого внешних файлов, так же как может быть обработан
PI, и путь для определения "доверия" к коду, содержащемуся в PI.
</para>
<para>
XML документы, которые используются в примере расположены под самим
примером (<filename>xmltest.xml</filename> и
<filename>xmltest2.xml</filename>.)
</para>
<para>
<example>
<title>Пример использования внешней сущности</title>
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
$file = "xmltest.xml";
function trustedFile($file)
{
// доверять только нашим собственным локальным файлам
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;
// Если обработанный документ является "доверенным", то можно сказать,
// что запуск расположенного в нем кода является безопасным. Если нет,
// то вместо запуска отобразить сам код.
if (trustedFile($parser_file[$parser])) {
eval($data);
} else {
printf("Небезопасный код PHP: <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 в %s\n", $openEntityNames,
$systemId);
return false;
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($parser, $data, feof($fp))) {
printf("Ошибка XML: %s в строке %d в процессе разбора сущности %s\n",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser), $openEntityNames);
return false;
}
}
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-файла невозможно");
}
echo "<pre>";
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("Ошибка XML: %s в строке %d\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
echo "</pre>";
echo "разбор завершён\n";
?>
]]>
</programlisting>
</example>
</para>
<para>
<example>
<title>xmltest.xml</title>
<programlisting role="xml">
<![CDATA[
<?xml version='1.0'?>
<!DOCTYPE chapter SYSTEM "/just/a/test.dtd" [
<!ENTITY plainEntity "FOO entity">
<!ENTITY systemEntity SYSTEM "xmltest2.xml">
]>
<chapter>
<TITLE>Title &plainEntity;</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>About this Document</title>
<para>
<!-- this is a comment -->
<?php echo 'Hi! This is PHP version ' . phpversion(); ?>
</para>
</section>
</chapter>
]]>
</programlisting>
</example>
</para>
<para>
Этот файл подключён из <filename>xmltest.xml</filename>:
<example>
<title>xmltest2.xml</title>
<programlisting role="xml">
<![CDATA[
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY testEnt "test entity">
]>
<foo>
<element attrib="value"/>
&testEnt;
<?php echo "Здесь запущен некий код PHP"; ?>
</foo>
]]>
</programlisting>
</example>
</para>
</section>
<section xml:id="example.xml-parsing-with-class">
<title>Разбор XML с помощью класса</title>
<para>
В примере показано, как использовать класс с обработчиками.
<example>
<title>Показать структуру элемента XML</title>
<programlisting role="php">
<![CDATA[
<?php
$file = "examples/book.xml";
class CustomXMLParser
{
private $fp;
private $parser;
private $depth = 0;
function __construct(string $file)
{
if (!($this->fp = fopen($file, 'r'))) {
throw new RunTimeException("не удалось открыть файл XML '{$file}'");
}
$this->parser = xml_parser_create();
xml_set_element_handler($this->parser, self::startElement(...), self::endElement(...));
xml_set_character_data_handler($this->parser, self::cdata(...));
}
private function startElement($parser, $name, $attrs)
{
for ($i = 0; $i < $this->depth; $i++) {
echo " ";
}
echo "$name\n";
$this->depth++;
}
private function endElement($parser, $name)
{
$this->depth--;
}
private function cdata($parse, $cdata)
{
if (trim($cdata) === '') {
return;
}
for ($i = 0; $i < $this->depth; $i++) {
echo " ";
}
echo trim($cdata), "\n";
}
public function parse()
{
while ($data = fread($this->fp, 4096)) {
if (!xml_parse($this->parser, $data, feof($this->fp))) {
throw new RunTimeException(
sprintf(
"Ошибка XML: %s в строке %d",
xml_error_string(xml_get_error_code($this->parser)),
xml_get_current_line_number($this->parser)
)
);
}
}
}
}
$xmlParser = new CustomXMLParser($file);
$xmlParser->parse();
?>
]]>
</programlisting>
</example>
</para>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->