PHP XML Expat-parser

Kursrekommendationer:

Inbyggda Expat-parser gör det möjligt att hantera XML-dokument i PHP.

Vad är XML?

I XML finns det inga fördefinierade taggar. Du måste definiera dina egna taggar.

Om du vill lära dig mer om XML, besök vår XML 教程.

Vad är Expat?

För att läsa och uppdatera - skapa och behandla - en XML-dokument behöver du en XML-parser.

Det finns två grundläggande typer av XML-parserar:

  • En trädbaserad parser: Denna typ av parser konverterar XML-dokument till en trädstruktur. Den analyserar hela dokumentet och erbjuder API för att komma åt element i trädet, till exempel dokumentobjektmodellen (DOM).
  • En händelsebaserad parser: Se XML-dokumentet som en serie av händelser. När en specifik händelse inträffar, anropar parsern en funktion för att hantera den.

Expat-parser är en händelsebaserad parser.

En händelsebaserad parser fokuserar på innehållet i XML-dokumentet, inte deras resultat. Därför kan en händelsebaserad parser komma åt data snabbare än en trädbaserad parser.

Se nedan för en XML-fragment:

<from>John</from>

En händelsebaserad parser rapporterar ovanstående XML som en rad av tre händelser:

  • Börja element: from
  • Börja CDATA-sektion, värde: John
  • Stäng element: from

Ovanstående XML-exempel innehåller korrekt formaterad XML. Men detta exempel är ogiltigt XML eftersom det inte har någon tillhörande dokumenttypsdeklaration (DTD) eller inbäddad DTD.

Men det spelar ingen roll när man använder Expat-parser. Expat är en parser som inte kontrollerar validiteten och ignorerar alla DTD.

Som en händelsebaserad, icke-validerande XML-parser är Expat snabb och lätt, och är mycket lämplig för PHP:s webbapplikationer.

Kommentar:XML-dokument måste vara korrekt formaterade, annars kommer Expat att generera fel.

Installera

XML Expat-parser är en del av PHP-kärnan. Det är inte nödvändigt att installera för att använda dessa funktioner.

XML-fil

Vi kommer att använda följande XML-fil i vårt exempel:

<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Påminnelse</heading>
<body>Glöm inte mötet!</body>
</note>

Initialisera XML-parser

Vi vill initialisera XML-parser i PHP, definiera hanterare för olika XML-händelser och sedan解析这个 XML-fil。

Exempel

<?php
//Initialisera XML-parser
$parser=xml_parser_create();
//Funktion att använda vid början av ett element
function start($parser,$element_name,$element_attrs)
  {
  switch($element_name)
    {
    case "NOTE":
    echo "-- Notering --<br />";
    break; 
    case "TO":
    echo "Till: ";
    break; 
    case "FROM":
    echo "Från: ";
    break; 
    case "HEADING":
    echo "Rubrik: ";
    break; 
    case "BODY":
    echo "Meddelande: ";
    }
  }
//Funktion att använda vid slutet av ett element
function stop($parser,$element_name)
  {
  echo "<br />";
  }
//Funktion att använda när man hittar karaktärsdata
function char($parser,$data)
  {
  echo $data;
  }
//Specificera elementhanterare
xml_set_element_handler($parser,"start","stop");
//Specificera datahanterare
xml_set_character_data_handler($parser,"char");
//Öppna XML-fil
$fp=fopen("test.xml","r");
//Läs data
medan ($data=fread($fp,4096))
  {
  xml_parse($parser,$data,feof($fp)) eller 
  dö(i "XML Error: %s på rad %d", 
  xml_error_string(xml_get_error_code($parser)),
  xml_get_current_line_number($parser)));
  }
//Free the XML parser
xml_parser_free($parser);
?>

以上代码的输出:

-- Note --
To: George
From: John
Heading: Reminder
Message: Don't forget the meeting!

工作原理解释:

  • 通过 xml_parser_create() 函数初始化 XML 解析器
  • 创建配合不同事件处理程序的的函数
  • 添加 xml_set_element_handler() 函数来定义,当解析器遇到开始和结束标签时执行哪个函数
  • 添加 xml_set_character_data_handler() 函数来定义,当解析器遇到字符数据时执行哪个函数
  • 通过 xml_parse() 函数来解析文件 "test.xml"
  • 万一有错误的话,添加 xml_error_string() 函数把 XML 错误转换为文本说明
  • 调用 xml_parser_free() 函数来释放分配给 xml_parser_create() 函数的内存

更多 PHP Expat 解析器的信息

如需更多有关 PHP Expat 函数的信息,请访问我们的 PHP XML Parser 参考手册。