search
HomeBackend DevelopmentPHP TutorialPHP and XML: Using the expat function (2)

 php 和 xml: 使用expat函数(二)
  让我们看一下实际处理这个文档的PHP代码。 



/*NewsBoy : News system for the web written in PHP by Justin Grant (Web: jusgrant.cjb.net or justin.host.za.net Mail: justin@glendale.net)25 March V0.0.2 Converted Newsboy to a PHP class, allowing the layout to be easily modified. Also added made the HTML that is genrated a little easier to read.24 March V0.0.1 Just completed the intial version, very rough and basic.*/ 
class newsboy { var $xml_parser; var $xml_file; var $html; var $open_tag ; var $close_tag ; 
//Class Constructor 
function newsboy() { $this->xml_parser = ""; $this->xml_file = ""; $this->html = ""; $this->open_tag = array( 
//these are the default settings but they are quite easy to modify 
"NEWSBOY" => "nn", "STORY" => " ", "DATE" => "", "SLUG" => " ", "TEXT" => "", "PIC" => "", "NEWLINE" => "" ); $this->close_tag = array( "NEWSBOY" => " 
nnn", "STORY" => "", "DATE" => "", "SLUG" => " 
", "TEXT" => "n", "PIC" => " " 
" ); } 
//Class Destructor (has to be invoked manually as PHP does not support destructors) 

function destroy() { xml_parser_free($this->xml_parser); } 
//Class Members 
function concat($str) { $this->html .= $str; } 
function startElement($parser, $name, $attrs) { //global $open_tag; if ($format= $this->open_tag[$name]) { $this->html .= $format; } } 
function endElement($parser, $name) { global $close_tag; if ($format= $this->close_tag[$name]) { $this->html .= $format; } } 
function characterData($parser, $data) { $this->html .= $data; } 
/* function PIHandler($parser, $target, $data) { //switch (strtolower($target)){ // case "php": eval($data); // break; //} }*/ 
function parse() { $this->xml_parser = xml_parser_create(); xml_set_object($this->xml_parser, &$this); // use case-folding so we are sure to find the tag in $map_array 
xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($this->xml_parser, "startElement", "endElement"); xml_set_character_data_handler($this->xml_parser, "characterData");//xml_set_PRocessing_instruction_handler($this->xml_parser, "PIHandler"); 
if (!($fp = fopen($this->xml_file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($this->xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser))); } } }} 
?> 



-------------------------------------------------------------------------------- 

  在这个类的构造函数中,我创建了打开与关闭两个标记数组。数组的关键字与我后面将要分析的标记是 
一样的,并且它们相应的值包含格式化打开与关闭标记的HTML代码。 

  我定义了一个简单的类析构函数用来当我们不再需要它时释放XML 分析器。这个函数不得不手工调用, 
因为PHP不支持当一个对象释放时自动调用类的析构函数。 

  然后我定义了在XML文档中用来分析打开和关闭标记的主回调方法。我也定义了一个数据分析方法, 将 
用于当打开和关闭标记中有数据时,对数据进行简单的格式化,后面我将向你演示如何将这些回调方法注册 
到分析器中。 

  在startElement和closeElement(当分析到一个打开或关闭标专时被分别调用)中使用 标记的名字 
作为索引键值对相应的数组进行查询。如果那个键值存在,则返回值并且追加到类的'html' 属性的后面。 
'html'属性将在以后我们真正显示文档内容的时候使用。 

  characterData方法简单地将标记之间的值加到类的html属性的后面。 

  被注释起来的叫PIHandler的方法是一个回调函数,我还未曾实现它。如果它存在的话,它将直接在XML 
文档中处理php脚本。 

Now, let me explain the main parsing method call, guess what, parse()!!!

 The first line calls the function xml_parser_create(), which will return an expat xml parser instance and be Saved in the
attribute&this->xml_parser of the class.

  Next, we need to use the function xml_set_object() to register a callback function for the class method.

 This is how I use it, xml_set_object($this->xml_parser, &$this). In the first parameter, I specified the class attribute that holds the xml parser using
, and then in the second parameter, I specified the instance address of the PHP object. This lets the analyzer know that all callback functions that will be registered are actual methods of the specified class at that address. This is like a 'pass by reference' in c or c++, some people
simply call it a 'reference variable'.

 In the next line, I call xml_parser_set_option() to set an attribute of the xml parser, using case
folding. Case folding just tells the parser to know that when I parse my XML document I don't care about case sensitivity, but if you
want to use case sensitivity to define two different tags like or , you can leave it unset .

By using xml_set_element_handler(), I specify callback functions for the start and end tags, named
"startElement" and "endElement".

Next, I use xml_set_character_data_handler() to specify the character data processing handle as a callback function named
characterData(). The annotated function call, xml_set_processing_instruction_handler(), is the one I used to register the function PIHandler(). PIHandler can be included in XML documents to process PHP code.

The rest of the code simply reads the XML file and parses it. If an error occurs, the error details will be returned, including the line number where the error occurred.

The above is the content of PHP and XML: using the expat function (2). For more related articles, please pay attention to the PHP Chinese website (www.php.cn)!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
How can you protect against Cross-Site Scripting (XSS) attacks related to sessions?How can you protect against Cross-Site Scripting (XSS) attacks related to sessions?Apr 23, 2025 am 12:16 AM

To protect the application from session-related XSS attacks, the following measures are required: 1. Set the HttpOnly and Secure flags to protect the session cookies. 2. Export codes for all user inputs. 3. Implement content security policy (CSP) to limit script sources. Through these policies, session-related XSS attacks can be effectively protected and user data can be ensured.

How can you optimize PHP session performance?How can you optimize PHP session performance?Apr 23, 2025 am 12:13 AM

Methods to optimize PHP session performance include: 1. Delay session start, 2. Use database to store sessions, 3. Compress session data, 4. Manage session life cycle, and 5. Implement session sharing. These strategies can significantly improve the efficiency of applications in high concurrency environments.

What is the session.gc_maxlifetime configuration setting?What is the session.gc_maxlifetime configuration setting?Apr 23, 2025 am 12:10 AM

Thesession.gc_maxlifetimesettinginPHPdeterminesthelifespanofsessiondata,setinseconds.1)It'sconfiguredinphp.iniorviaini_set().2)Abalanceisneededtoavoidperformanceissuesandunexpectedlogouts.3)PHP'sgarbagecollectionisprobabilistic,influencedbygc_probabi

How do you configure the session name in PHP?How do you configure the session name in PHP?Apr 23, 2025 am 12:08 AM

In PHP, you can use the session_name() function to configure the session name. The specific steps are as follows: 1. Use the session_name() function to set the session name, such as session_name("my_session"). 2. After setting the session name, call session_start() to start the session. Configuring session names can avoid session data conflicts between multiple applications and enhance security, but pay attention to the uniqueness, security, length and setting timing of session names.

How often should you regenerate session IDs?How often should you regenerate session IDs?Apr 23, 2025 am 12:03 AM

The session ID should be regenerated regularly at login, before sensitive operations, and every 30 minutes. 1. Regenerate the session ID when logging in to prevent session fixed attacks. 2. Regenerate before sensitive operations to improve safety. 3. Regular regeneration reduces long-term utilization risks, but the user experience needs to be weighed.

How do you set the session cookie parameters in PHP?How do you set the session cookie parameters in PHP?Apr 22, 2025 pm 05:33 PM

Setting session cookie parameters in PHP can be achieved through the session_set_cookie_params() function. 1) Use this function to set parameters, such as expiration time, path, domain name, security flag, etc.; 2) Call session_start() to make the parameters take effect; 3) Dynamically adjust parameters according to needs, such as user login status; 4) Pay attention to setting secure and httponly flags to improve security.

What is the main purpose of using sessions in PHP?What is the main purpose of using sessions in PHP?Apr 22, 2025 pm 05:25 PM

The main purpose of using sessions in PHP is to maintain the status of the user between different pages. 1) The session is started through the session_start() function, creating a unique session ID and storing it in the user cookie. 2) Session data is saved on the server, allowing data to be passed between different requests, such as login status and shopping cart content.

How can you share sessions across subdomains?How can you share sessions across subdomains?Apr 22, 2025 pm 05:21 PM

How to share a session between subdomains? Implemented by setting session cookies for common domain names. 1. Set the domain of the session cookie to .example.com on the server side. 2. Choose the appropriate session storage method, such as memory, database or distributed cache. 3. Pass the session ID through cookies, and the server retrieves and updates the session data based on the ID.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version