金沙贵宾会官网|金沙贵宾会登录-官网

【A】金沙贵宾会官网超高的返奖率为娱乐者提供资金保障,所以金沙贵宾会登录官网更加的方便了你的娱乐,申请88元彩金,因为在当中不仅仅只有游戏。

解析xml文档代码,dom读取xml文档代码

日期:2019-09-29编辑作者:网络安全

$dom = new domdocument;
$dom->loadxml($xml_str);

复制代码 代码如下:

<books>
<book>
<author>jack herrington</author>
<title>php教程 hacks</title>
<publisher>o'reilly</publisher>
</book>
<book>
<author>jack herrington</author>
<title>podcasting hacks</title>
<publisher>o'reilly</publisher>
</book>
</books>

$doc = new domdocument();
$doc->load("17-1.xml");

复制代码 代码如下:

 

*/
?>

//修改文本节点内容
$xml = new SimpleXMLElement($xmlstr);
$xml->book[0]->characters->character[0]->name = 'Big Cliff';
echo $xml->asXML();

脚本首先设置 g_books 数组,它在内存中容纳所有图书和图书信息,g_elem 变量保存脚本目前正在处理的标记的名称。然后脚本定义回调函数。在这个示例中,回调函数是 startelement、endelement 和 textdata。在打开和关闭标记的时候,分别调用 startelement 和 endelement 函数。在开始和结束标记之间的文本上面,调用 textdata。
在这个示例中,startelement 标记查找 book 标记,在 book 数组中开始一个新元素。然后,textdata 函数查看当前元素,看它是不是 publisher、title 或 author 标记。如果是,函数就把当前文本放入当前图书。
为了让解析继续,脚本用 xml_parser_create 函数创建解析器。然后,设置回调句柄。之后,脚本读取文件并把文件的大块内容发送到解析器。在文件读取之后,xml_parser_free 函数删除解析器。脚本的末尾输出 g_books 数组的内容。
可以看到,这比编写 dom 的同样功能要困难得多。如果没有 dom 库也没有 sax

/*
17-1.xml

一.使用DOM生成和读取XML文件
实例一:

创建 xml 时该怎么办?

回页首
用 php 编写 xml
如果 dom 不可用,可以用 php 的文本模板编写 xml。清单 7 显示了 php 如何构建图书 xml 文件。
清单 7. 用 php 编写图书 xml
复制代码 代码如下:

<?php
$books = array();
$books [] = array(
'title' => 'php hacks',
'author' => 'jack herrington',
'publisher' => "o'reilly"
);
$books [] = array(
'title' => 'podcasting hacks',
'author' => 'jack herrington',
'publisher' => "o'reilly"
);
?>
<books>
<?php
foreach( $books as $book )
{
?>
<book>
<title><?php echo( $book['title'] ); ?></title>
<author><?php echo( $book['author'] ); ?>
</author>
<publisher><?php echo( $book['publisher'] ); ?>
</publisher>
</book>
<?php
}
?>
</books>

 

脚本的顶部与 dom 脚本类似。脚本的底部打开 books 标记,然后在每个图书中迭代,创建 book 标记和所有的内部 title、author 和 publisher 标记。
这种方法的问题是对实体进行编码。为了确保实体编码正确,必须在每个项目上调用 htmlentities 函数,如清单 8 所示。
清单 8. 使用 htmlentities 函数对实体编码
复制代码 代码如下:

<books>
<?php
foreach( $books as $book )
{
$title = htmlentities( $book['title'], ent_quotes );
$author = htmlentities( $book['author'], ent_quotes );
$publisher = htmlentities( $book['publisher'], ent_quotes );
?>
<book>
<title><?php echo( $title ); ?></title>
<author><?php echo( $author ); ?> </author>
<publisher><?php echo( $publisher ); ?>
</publisher>
</book>
<?php
}
?>
</books>

 代码如下

二.使用simple生成和读取xml文件
实例一:

树顶部的 books 节点有两个 book 子标记。在每本书中,有 author、publisher 和 title 几个节点。author、publisher 和 title 节点分别有包含文本的文本子节点。
读取图书 xml 文件并用 dom 显示内容的代码如清单 2 所示。
清单 2. 用 dom 读取图书 xml
复制代码 代码如下:

//domdocument 加载xml文档

您可能感兴趣的文章:

  • PHP基于XMLWriter操作xml的方法分析
  • php XMLWriter类的简单示例代码(RSS输出)
  • PHP XML操作的各种方法解析(比较详细)
  • PHP处理数组和XML之间的互相转换
  • PHP中的生成XML文件的4种方法分享
  • php生成xml简单实例代码
  • PHP XML操作类DOMDocument
  • php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
  • php实现xml与json之间的相互转换功能实例
  • php的SimpleXML方法读写XML接口文件实例解析
  • PHP使用XMLWriter读写xml文件操作详解

脚本首先创建一个 new domdocument 对象,用 load 方法把图书 xml 装入这个对象。之后,脚本用 getelementsbyname 方法得到指定名称下的所有元素的列表。
在 book 节点的循环中,脚本用 getelementsbyname 方法获得 author、publisher 和 title 标记的 nodevalue。nodevalue 是节点中的文本。脚本然后显示这些值。
可以在命令行上像这样运行 php 脚本:
% php e1.php
php hacks - jack herrington - o'reilly
podcasting hacks - jack herrington - o'reilly
%
可以看到,每个图书块输出一行。这是一个良好的开始。但是,如果不能访问 xml dom 库该怎么办?
用 sax 解析器读取 xml
读取 xml 的另一种方法是使用 xml simple api(sax)解析器。php 的大多数安装都包含 sax 解析器。sax 解析器运行在回调模型上。每次打开或关闭一个标记时,或者每次解析器看到文本时,就用节点或文本的信息回调用户定义的函数。
sax 解析器的优点是,它是真正轻量级的。解析器不会在内存中长期保持内容,所以可以用于非常巨大的文件。缺点是编写 sax 解析器回调是件非常麻烦的事。清单 3 显示了使用 sax 读取图书 xml 文件并显示内容的代码。
清单 3. 用 sax 解析器读取图书 xml
复制代码 代码如下:

echo $dom->savexml();
$dom->save("test.xml");

实例二:

 1 中的 xml 包含一个图书列表。父标记 <books> 包含一组 <book> 标记,每个 <book> 标记又包含 <author>、<title> 和 <publisher> 标记。
当 xml 文档的标记结构和内容得到外部模式文件的验证后,xml 文档就是正确的。模式文件可以用不同的格式指定。对于本文来说,所需要的只是格式良好的 xml。
如果觉得 xml 看起来很像超文本标记语言(html),那么就对了。xml 和 html 都是基于标记的语言,它们有许多相似之处。但是,要着重指出的是:虽然 xml 文档可能是格式良好的 html,但不是所有的 html 文档都是格式良好的 xml。换行标记(br)是 xml 和 html 之间区别的一个好例子。这个换行标记是格式良好的 html,但不是格式良好的 xml:
<p>this is a paragraph<br>
with a line break</p>
这个换行标记是格式良好的 xml 和 html:
<p>this is a paragraph<br />
with a line break</p>
如果要把 html 编写成同样是格式良好的 xml,请遵循 w3c 委员会的可扩展超文本标记语言(xhtml)标准。所有现代的浏览器都能呈现 xhtml。而且,还可以用 xml 工具读取 xhtml 并找出文档中的数据,这比解析 html 容易得多。
使用 dom 库读取 xml
读取格式良好的 xml 文件最容易的方式是使用编译成某些 php 安装的文档对象模型 (dom)库。dom 库把整个 xml 文档读入内存,并用节点树表示它,如图 1 所示。
图 1. 图书 xml 的 xml dom 树

//解析xml文档

<?php
$dom = new domDocument;
$dom->loadXML('<books><book><title>Great American
Novel</title></book></books>');
if (!$dom) {
echo 'Error while parsing the document';
exit;
}
$s = simplexml_import_dom($dom);
echo $s->book[0]->title; // Great American Novel
?>

 

 代码如下

<?php
$sxe = simplexml_load_string('<books><book><title>Great American
Novel</title></book></books>');
if ($sxe === false) {
echo 'Error while parsing the document';
exit;
}
$dom_sxe = dom_import_simplexml($sxe);
if (!$dom_sxe) {
echo 'Error while converting XML';
exit;
}
$dom = new DOMDocument('1.0');
$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $dom->appendChild($dom_sxe);
$test2 = $dom->saveXML(); // put string in test2
$dom -> save('test2.xml'); // save as file
?>

<?php
$doc = new domdocument();
$doc->load( 'books.xml' );
$books = $doc->getelementsbytagname( "book" );
foreach( $books as $book )
{
$authors = $book->getelementsbytagname( "author" );
$author = $authors->item(0)->nodevalue;
$publishers = $book->getelementsbytagname( "publisher" );
$publisher = $publishers->item(0)->nodevalue;
$titles = $book->getelementsbytagname( "title" );
$title = $titles->item(0)->nodevalue;
echo "$title - $author - $publishern";
}
?>

$books = $doc->getelementsbytagname("book");
foreach($books as $book)
{
    $authors = $book->getelementsbytagname("author");
    $author = $authors->item(0)->nodevalue;
   
    $publishers = $book->getelementsbytagname("publisher");
    $publisher = $publishers->item(0)->nodevalue;
   
    $titles = $book->getelementsbytagname("title");
    $title = $titles->item(0)->nodevalue;
   
    $prices = $book->getelementsbytagname("price");
    $price = $prices->item(0)->nodevalue;
   
    echo "$title - $author - $publisher - $price";
    echo "<br/>";
    echo "<br/>";
}

<?
$xmlstr = <<<XML
<?xml version='1.0' standalone='yes'?>
<books>
<book>
<title>Great American Novel</title>
<characters>
<character>
<name>Cliff</name>
<desc>really great guy</desc>
</character>
<character>
<name>Lovely Woman</name>
<desc>matchless beauty</desc>
</character>
<character>
<name>Loyal Dog</name>
<desc>sleepy</desc>
</character>
</characters>
<plot>
Cliff meets Lovely Woman. Loyal Dog sleeps, but wakes up to bark
at mailman.
</plot>
<success type='bestseller'>4</success>
<success type='bookclubs'>9</success>
</book>
</books>
XML;

解析器读取来自用户的 xml。

回页首
用 dom 编写 xml
读取 xml 只是公式的一部分。该怎样编写 xml 呢?编写 xml 最好的方式就是用 dom。清单 5 显示了 dom 构建图书 xml 文件的方式。
清单 5. 用 dom 编写图书 xml
复制代码 代码如下:

 

<?php
$books = array();
$books [] = array(
'title' => 'php hacks',
'author' => 'jack herrington',
'publisher' => "o'reilly"
);
$books [] = array(
'title' => 'podcasting hacks',
'author' => 'jack herrington',
'publisher' => "o'reilly"
);
$doc = new domdocument();
$doc->formatoutput = true;
$r = $doc->createelement( "books" );
$doc->appendchild( $r );
foreach( $books as $book )
{
$b = $doc->createelement( "book" );
$author = $doc->createelement( "author" );
$author->appendchild(
$doc->createtextnode( $book['author'] )
);
$b->appendchild( $author );
$title = $doc->createelement( "title" );
$title->appendchild(
$doc->createtextnode( $book['title'] )
);
$b->appendchild( $title );
$publisher = $doc->createelement( "publisher" );
$publisher->appendchild(
$doc->createtextnode( $book['publisher'] )
);
$b->appendchild( $publisher );
$r->appendchild( $b );
}
echo $doc->savexml();
?>

在脚本的顶部,用一些示例图书装入了 books 数组。这个数据可以来自用户也可以来自数据库教程。
示例图书装入之后,脚本创建一个 new domdocument,并把根节点 books 添加到它。然后脚本为每本书的 author、title 和 publisher 创建节点,并为每个节点添加文本节点。每个 book 节点的最后一步是重新把它添加到根节点 books。
脚本的末尾用 savexml 方法把 xml 输出到控制台。(也可以用 save 方法创建一个 xml 文件。)脚本的输出如清单 6 所示。
清单 6. dom 构建脚本的输出
复制代码 代码如下:

php e4.php
<?xml version="1.0"?>
<books>
<book>
<author>jack herrington</author>
<title>php hacks</title>
<publisher>o'reilly</publisher>
</book>
<book>
<author>jack herrington</author>
<title>podcasting hacks</title>
<publisher>o'reilly</publisher>
</book>
</books>

使用 dom 的真正价值在于它创建的 xml 总是格式正确的。但是如果不能用 dom

 代码如下

//添加子元素的文本节点
$xml = new SimpleXMLElement($xmlstr);
$character = $xml->book[0]->characters->addChild('character');
$character->addChild('name', 'Yellow Cat');
$character->addChild('desc', 'aloof');
$success = $xml->book[0]->addChild('success', '2');
$success->addAttribute('type', 'reprints');
echo $xml->asXML();

<?php
$g_books = array();
$g_elem = null;
function startelement( $parser, $name, $attrs )
{
global $g_books, $g_elem;
if ( $name == 'book' ) $g_books []= array();
$g_elem = $name;
}
function endelement( $parser, $name )
{
global $g_elem;
$g_elem = null;
}
function textdata( $parser, $text )
{
global $g_books, $g_elem;
if ( $g_elem == 'author' ||
$g_elem == 'publisher' ||
$g_elem == 'title' )
{
$g_books[ count( $g_books ) - 1 ][ $g_elem ] = $text;
}
}
$parser = xml_parser_create();
xml_set_element_handler( $parser, "startelement", "endelement" );
xml_set_character_data_handler( $parser, "textdata" );
$f = fopen( 'books.xml', 'r' );
while( $data = fread( $f, 4096 ) )
{
xml_parse( $parser, $data );
}
xml_parser_free( $parser );
foreach( $g_books as $book )
{
echo $book['title']." - ".$book['author']." - ";
echo $book['publisher']."n";
}
?>

$dom->load('17-1.xml');
$root = $dom->documentelement;

//提取节点内容
$xml = new SimpleXMLElement($xmlstr);
foreach ($xml->book[0]->success as $success) {
switch((string) $success['type']) { // Get attributes as element indices
case 'bestseller':
echo $success. ' months on bestseller list<br>';
break;
case 'bookclubs':
echo $success. ' bookclub listings';
break;
}
}

库该怎么办?还有替代方案么?

回页首
用正则表达式解析 xml
可以肯定,即使提到这个方法,有些工程师也会批评我,但是确实可以用正则表达式解析 xml。清单 4 显示了使用 preg_ 函数读取图书文件的示例。
清单 4. 用正则表达式读取 xml
复制代码 代码如下:

<?php
$xml = "";
$f = fopen( 'books.xml', 'r' );
while( $data = fread( $f, 4096 ) ) { $xml .= $data; }
fclose( $f );
preg_match_all( "/<book>(.*?)</book>/s",
$xml, $bookblocks );
foreach( $bookblocks[1] as $block )
{
preg_match_all( "/<author>(.*?)</author>/",
$block, $author );
preg_match_all( "/<title>(.*?)</title>/",
$block, $title );
preg_match_all( "/<publisher>(.*?)</publisher>/",
$block, $publisher );
echo( $title[1][0]." - ".$author[1][0]." - ".
$publisher[1][0]."n" );
}
?>

请注意这个代码有多短。开始时,它把文件读进一个大的字符串。然后用一个 regex 函数读取每个图书项目。最后用 foreach 循环,在每个图书块间循环,并提取出 author、title 和 publisher。
那么,缺陷在哪呢?使用正则表达式代码读取 xml 的问题是,它并没先进行检查,确保 xml 的格式良好。这意味着在读取之前,无法知道 xml 是否格式良好。而且,有些格式正确的 xml 可能与正则表达式不匹配,所以日后必须修改它们。
我从不建议使用正则表达式读取 xml,但是有时它是兼容性最好的方式,因为正则表达式函数总是可用的。不要用正则表达式读取直接来自用户的 xml,因为无法控制这类 xml 的格式或结构。应当一直用 dom 库或 sax

$dom = new domdocument;

复制代码 代码如下:

$xml_str = "<?xml version='1.0'?>";
$xml_str .= "<books>";
$xml_str .= "<book>";
$xml_str .= "<title>harry potter</title>";
$xml_str .= "<author>j.k.rowling</author>";
$xml_str .= "<publisher>warner bros.</publisher>";
$xml_str .= "<price>39.0</price>";
$xml_str .= "</book>";
$xml_str .= "</books>";

simpleXML导入DOM:

<?xml version="1.0" encoding="gb2312"?>
<books>
    <book>
        <title>learning php5</title>
        <author>david</author>
        <publisher>white water press</publisher>
        <price>29.90</price>
    </book>
    <book>
        <title>learning xml</title>
        <author>jeffson</author>
        <publisher>white water press</publisher>
        <price>50.79</price>
    </book>
    <book>
        <title>using perl</title>
        <author>lucas</author>
        <publisher>white water press</publisher>
        <price>17.00</price>
    </book>
    <book>
        <title>windows networks</title>
        <author>paul</author>
        <publisher>white water press</publisher>
        <price>32.99</price>
    </book>
    <book>
        <title>fly leaf</title>
        <author>jenny</author>
        <publisher>white water press</publisher>
        <price>19.50</price>
    </book>
</books>

复制代码 代码如下:

<?xml version="1.0"?>
<books>
<book>
<author>Jack Herrington</author>
<title>PHP Hacks</title>
<publisher>O'Reilly</publisher>
</book>
<book>
<author>Jack Herrington</author>
<title>Podcasting Hacks</title>
<publisher>O'Reilly</publisher>
</book>
</books>

实例二:

三.DOM和simple互操作
DOM导入simpleXML:

复制代码 代码如下:

$doc = new DOMDocument();
$doc->load('test1.xml');
$books = $doc->getElementsByTagName("book");
foreach($books as $book){
$authors = $book->getElementsByTagName("author");
$author = $authors->item(0)->nodeValue;
$publishers = $book->getElementsByTagName( "publisher" );
$publisher = $publishers->item(0)->nodeValue;
$titles = $book->getElementsByTagName( "title" );
$title = $titles->item(0)->nodeValue;
echo "$title - $author - $publishern";
}

<?php
//Creates XML string and XML document using the DOM
$dom = new DomDocument('1.0');
//add root - <books>
$books = $dom->appendChild($dom->createElement_x_x ('books'));
//add <book> element to <books>
$book = $books->appendChild($dom->createElement_x_x ('book'));
//add <title> element to <book>
$title = $book->appendChild($dom->createElement_x_x ('title'));
//add <title> text node element to <title>
$title->appendChild($dom->createTextNode('Great American Novel'));
//generate xml
$dom->formatOutput = true; // set the formatOutput attribute of domDocument to true
//save XML as string or file
$test1 = $dom->saveXML(); // put string in test1
$dom -> save('test1.xml'); // save as file
?>

复制代码 代码如下:

$aa = "111";
$xmlstr = <<<XML
<?xml version='1.0'?>
<document>
<title>{$aa}</title>
<from>Joe</from>
<to>Jane</to>
<body>
I know that's the answer -- but what's the question?
</body>
</document>
XML;
$dom = new domDocument;
$dom->loadXML($xmlstr);
$test1 = $dom->saveXML();
$dom->save('test1.xml');

复制代码 代码如下:

复制代码 代码如下:

?>

实例三:
test1.xml:

example.php:

if (file_exists('test1.xml')) { //读取xml文件
$xml = simplexml_load_file('test1.xml');
var_dump(xml);
} else {
exit('Failed to open test1.xml.');
}

本文由金沙贵宾会官网发布于网络安全,转载请注明出处:解析xml文档代码,dom读取xml文档代码

关键词:

func_num_args实现伪重载,php函数的传值与传址

偶尔在网上看到关于php的伪重载的问题,有点兴趣便研究了一下。下面作者将说说php如何利用func_get_arg,func_get_args,f...

详细>>

php删除钦点目录下的相干文书实例,php删除目录

 代码如下 本文实例讲述了php实现删除指定目录下相关文件的方法。分享给大家供大家参考。具体实现方法如下: 例...

详细>>

的行使介绍

php教程 mysql教程_fetch_array与mysql_fetch_assoc区别 mysql_fetch_array --从结果集中取得一行作为关联数组,或数字数组,或二...

详细>>

php用户注册ID验证正则表达式,CodeIgniter使用php

1.检查客商名是或不是符合规定 两位以上的假名,数字,大概下划线   正则表明式直白以来是本身相比头痛的东西,...

详细>>