Files
archived-doc-pt-br/reference/xml/examples.xml
Leonardo Lara Rodrigues b8e6f6b888 sync with en rev
2025-10-21 09:03:14 -03:00

423 lines
11 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: b47e4bea197126359815c5e43403c4b77a0aaaa7 Maintainer: leonardolara Status: ready --><!-- CREDITS: fernandowobeto, leonardolara -->
<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>Exemplo de Estrutura de Elemento XML</title>
<para>
Este primeiro exemplo exibe a estrutura dos elementos de início em
um documento com indentação.
<example>
<title>Mostrar Estrutura de Elemento 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("could not open XML input");
}
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-map-tags">
<title>Exemplo de Mapeamento de Tags XML</title>
<para>
<example>
<title>Mapear XML para HTML</title>
<para>
Este exemplo mapeia tags em um documento XML diretamente para tags
HTML. Elementos não encontrados na "matriz de mapeamento" são ignorados.
Obviamente, este exemplo funcionará apenas com um tipo específico de
documento 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();
// use dobramento de caso para ter certeza de encontrar a tag em $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("não foi possível abrir a entrada XML");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("Erro XML: %s na linha %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>Exemplo de Entidade Externa XML</title>
<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 "confiança" para PIs contendo código.
</para>
<para>
Documentos XML que podem ser usados para este exemplo são encontrados abaixo
do exemplo (<filename>xmltest.xml</filename> e
<filename>xmltest2.xml</filename>).
</para>
<para>
<example>
<title>Exemplo de Entidade Externa</title>
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
$file = "xmltest.xml";
function trustedFile($file)
{
// confie apenas em arquivos locais de nossa propriedade
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;
// Se o documento analisado for "confiável", dizemos que é seguro
// para executar o código PHP dentro dele. Caso contrário, exiba o código
// em vez disso.
if (trustedFile($parser_file[$parser])) {
eval($data);
} else {
printf("Código PHP não confiável: <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("Não foi possível abrir a entidade %s em %s\n", $openEntityNames,
$systemId);
return false;
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($parser, $data, feof($fp))) {
printf("Erro XML: %s na linha %d ao analisar a entidade %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("não foi possível abrir a entrada XML");
}
echo "<pre>";
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("Erro XML: %s na linha %d\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
echo "</pre>";
echo "análise concluída\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>Título &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>Sobre este documento</title>
<para>
<!-- isto é um comentário -->
<?php echo 'Oi! Esta é a versão PHP' . phpversion(); ?>
</para>
</section>
</chapter>
]]>
</programlisting>
</example>
</para>
<para>
Este arquivo é incluído de <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 "Este é mais um código PHP sendo executado."; ?>
</foo>
]]>
</programlisting>
</example>
</para>
</section>
<section xml:id="example.xml-parsing-with-class">
<title>Interpretando XML Com Classes</title>
<para>
Este exemplo mostra como usar uma classe com manipuladores.
<example>
<title>Mostrando a Estrutura de Elemento 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("could not open XML file '{$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(
"Erro XML: %s at line %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
-->