用php读取和写入xmlDOM的实现代码

似乎读写的可扩展标记语言(XML)有点可怕与PHP。事实上,XML及其相关技术可能是可怕的,但是阅读和使用PHP编写XML不一定是一个可怕的任务。首先,你需要学习一点关于XML -它是什么和什么用它做的,那么你需要学习如何读写XML和PHP,有许多方法来做这个。
本文简要介绍了XML,然后说明了如何用PHP读取和编写XML。
什么是XML
XML是一种数据存储格式,它没有定义什么样的数据保存、数据格式不defined.xml只定义标签的属性,这些标签的格式的XML标记看起来像这样:
Jack Herrington
这个标签包含一些文本:Jack Herrington。
不包含文本的XML标记如下所示:

用XML编写东西的方法不止一种,例如,这个标签的输出与前面的相同:

您还可以将属性添加到XML标记中:

特殊字符也可以用xml编码:

包含标记和属性的XML文件被格式化为示例,这些示例格式良好,这意味着标签是对称的,字符被正确编码。清单1是格式良好的XML的一个示例。

清单1。xml图书列表示例
复制代码代码如下所示:


Jack Herrington
php黑客
奥赖利


Jack Herrington
播客的黑客
奥赖利



清单1中的XML包含一个图书列表,父标记包含一组标记,每个标记也包括在内,并标记。
当XML文档的标签结构和内容由外部模式文件验证时,XML文档是正确的。模式文件可以以不同格式指定。
如果你认为XML看起来像一个超文本标记语言(HTML),那么这是对的,都是基于XML和HTML标记语言,和他们有很多相似之处。然而,重要的是要指出的是,虽然XML文档是格式良好的HTML,并不是所有的HTML文档格式XML。线迹(BR)是XML和HTML之间的差异的一个很好的例子。线迹是格式良好的HTML,但不是格式良好的XML:
这是一段话
断线
该行是格式良好的XML和HTML:
这是一段话
断线
如果你想把HTML写进格式良好的XML中,遵循W3C委员会的可扩展超文本标记语言(XHTML)标准,所有的现代浏览器都能显示XHTML。此外,用XML工具读取XHTML并在文档中找到数据比用解析HTML容易得多。
使用DOM库读取xml
读取格式良好的XML文件最简单的方法是使用编译成PHP安装的文档对象模型(DOM)库,DOM库将整个XML文档读入内存并用节点树表示它,如图1所示。
图1。XML xml的DOM树
在树顶上的书submarks节点有两本书,每一本书,有作者、出版商、几个节点和标题。作者,出版商和标题文本子节点包含文本节点,分别。
读取XML文件并用DOM显示内容的代码如清单2所示。
清单2。用DOM读取xml
复制代码代码如下所示:
< PHP
doc =新DOMDocument(美元);
文件->加载('books美元。XML);
书=美元美元DOC -> getElementsByTagName(书);
foreach($书达书)
{
本书作者=美元美元-> getElementsByTagName(作者);
作者=美元美元作者->(0)->节点项目;
美元美元的出版商=书> getElementsByTagName(发行人);
出版商=美元美元出版商->(0)->节点项目;
标题=美元美元书-> getElementsByTagName(标题);
标题=美元美元标题->(0)->节点项目;
$;
}
>

脚本首先创建一个新的DOMDocument对象使用Load方法加载图书XML到对象后,该脚本使用getelementsbyname方法指定的名称下一个列表中的所有元素。
在本书结环,脚本使用getelementsbyname方法得到作者、出版商和标题tags.nodevalue节点,在节点的文本脚本然后显示值。
您可以像这样在命令行上运行PHP脚本:
PHP e1.php %
php黑客Jack Herrington -奥赖利
播客黑客- Jack Herrington -奥赖利
%
正如您所看到的,每个图书块输出一行。这是一个很好的开始。但是如果您不能访问XML DOM库呢
使用SAX解析器读取XML
另一种读取XML的方法是使用XML简单API(SAX)解析器。PHP的大部分安装都包括SAX解析器。SAX解析器在回调模型上运行。每次标记打开或关闭,或者每次解析器看到文本时,用户定义的函数都用节点或文本的信息进行回调。
SAX解析器的优点是它真的很轻,解析器不会在内存中保存很长时间,所以它可以用于非常大的文件。缺点是编写SAX解析器回调是一件非常麻烦的事情。清单3显示了使用SAX读取图书XML文件并显示内容的代码。
清单3。使用SAX解析器读取图书XML
复制代码代码如下所示:
< PHP
g_books美元=阵();
g_elem美元= null;
功能startElement(美元美元美元的解析器,名称,属性)
{
全球g_books美元,g_elem美元;
如果($name = = 'book)g_books美元{ } =(阵列);
g_elem美元=美元的名字;
}
功能EndElement($解析器,$name)
{
全球g_elem美元;
g_elem美元= null;
}
功能的文本数据($解析器,$文本)
{
全球g_books美元,g_elem美元;
如果(= = 'author g_elem美元的| |
g_elem美元= 'publisher| |
g_elem美元= =标题)
{
g_books美元{计数($ g_books)至g_elem } = $文本1;
}
}
美元xml_parser_create解析器=();
xml_set_element_handler($解析器,startElement
xml_set_character_data_handler($解析器,TextData );
$ F = fopen('books。XML,R');
而($data = fread($,4096))
{
xml_parse($解析器,$data);
}
xml_parser_free($分析器);
foreach(g_books美元美元的书)
{
echo $书{标题}。'author'} { $书。;
'publisher'} { echo的书。;
}
>

剧本第一集的g_books数组,它包含了所有的书和书的信息在内存中。的g_elem变量保存正在处理的脚本标签名,然后脚本定义的回调函数。在这个例子中,回调函数不同,endElement和文本数据。当标签被打开和关闭,startElement和EndElement功能称为分别。在开始标签和结束标签之间文本,文本数据称为。
在这个例子中,startElement标签查找图书标签并开始在本阵新的元素。然后,TextData功能着眼于当前的元素是否是一个出版商,标题或作者标签。如果是,函数将当前文本到当前的书。
为了分析继续,这个脚本创建的xml_parser_create功能分析器。然后,设置回调句柄。之后,脚本文件读取和发送文件的批量解析器。在文件读取的功能,xml_parser_free删除解析器的g_books数组的内容是脚本的最后输出。
正如您看到的,这比编写DOM的相同功能要困难得多。如果没有DOM库,也没有SAX库,该怎么办还有别的选择吗
--------------------------------------------------------------------------------
回到顶部
用正则表达式解析xml
可以肯定的是,即使提到这个方法,一些工程师会批评我,但这是真的,一个正则表达式可以用来解析XML,清单4显示了使用功能的preg_阅读一本书文件的一个实例。
清单4。使用正则表达式读取xml
复制代码代码如下所示:
< PHP
= $;
$ F = fopen('books。XML,R');
而($data = fread($,4096)){ $ XML = $数据;}
Fclose($);
preg_match_all( / ( / S)
美元美元的XML,书芯);
foreach(合书芯{ 1 } $块)
{
preg_match_all( / /(。*)
$块,$作者);
preg_match_all( / /(。*)
$块,$标题);
preg_match_all( / /(。*)
$块,$出版商);
回波($标题{ 1 } { 0 }。$作者{ 1 } { 0 }。。
$发行商{ 1 } { 0 }。;
}
>


请注意,该代码是多么短暂。它开始时读取文件到一个大的字符串,然后每本书的项目是一个正则表达式函数读取。最后,foreach循环是每本书块之间循环和作者,标题,和出版商的提取。
那么,缺陷在哪里呢使用正则表达式代码读取XML的问题是,它不首先检查XML是否格式良好,这意味着在读取之前无法知道XML是否格式化良好。此外,一些正确格式的XML和正则表达式不匹配,因此必须修改它们。
我不建议使用正则表达式读取XML,但有时这是最好的方式,因为是兼容的正则表达式函数总是可用的。不要使用正则表达式直接从用户读取XML,因为这类XML的格式或结构不能被控制。你应该从与DOM库或SAX解析器读取XML的用户。
--------------------------------------------------------------------------------
回到顶部
用DOM编写xml
阅读XML只是公式的一部分。您如何编写XML编写XML的最好方法是使用DOM,清单5显示了DOM构建一个图书XML文件的方式。
清单5。DOM中的图书xml
复制代码代码如下所示:
< PHP
图书=数组();
$图书(数组{ })
标题= > 'php黑客,
作者= >杰克Herrington,
发布者= >O'Reilly
);
$图书(数组{ })
标题= >播客广播的黑客,
作者= >杰克Herrington,
发布者= >O'Reilly
);
doc =新DOMDocument(美元);
文件-> formatoutput =真美元;
r = $doc -> createElement(书);
为文件-> appendChild(r);
foreach($书达书)
{
$ = $doc -> createElement(书);
作者=美元美元DOC -> createElement(作者);
作者-> appendChild(美元
$ DOC -> createTextNode($书{ 'author})
);
$ B -> appendChild(合作者);
标题=美元美元DOC -> createElement(标题);
$标题-> appendChild(
$ DOC -> createTextNode($书{标题})
);
$ B -> appendChild($标题);
出版商=美元美元DOC -> createElement(发行人);
出版商-> appendChild(美元
$ DOC -> createTextNode($书{ 'publisher})
);
$ B -> appendChild(美元发行);
$ R -> appendChild($);
}
echo文件-> savexml();
>


在脚本的顶部,有一些样本书被加载到图书数组中。
在样本加载脚本创建一个新节点添加书籍DOMDocument根了。剧本就创造了每本书的作者,标题,一个节点和出版商,并添加一个文本节点,每个节点的节点。每本书的最后一步是添加一遍书结根。
在脚本结束时,XML是出口用savexml方法控制台。(你也可以使用保存的方法来创建一个XML文件。)脚本的输出如清单6所示。
清单6。DOM来构建脚本的输出。
复制代码代码如下所示:
PHP e4.php



Jack Herrington
php黑客
奥赖利


Jack Herrington
播客的黑客
奥赖利



使用DOM的真正价值在于它创建的XML格式总是正确的,但是如果不能用DOM创建XML又会怎样呢
--------------------------------------------------------------------------------
回到顶部
用PHP编写xml
如果DOM不可用,您可以用PHP的文本模板编写XML。清单7显示PHP如何构建一个图书XML文件。
清单7。用PHP编写xml图书
复制代码代码如下所示:
< PHP
图书=数组();
$图书(数组{ })
标题= > 'php黑客,
作者= >杰克Herrington,
发布者= >O'Reilly
);
$图书(数组{ })
标题= >播客广播的黑客,
作者= >杰克Herrington,
发布者= >O'Reilly
);
>

< PHP
foreach($书达书)
{
>







< PHP
}
>



该脚本的顶部类似于DOM脚本。图书标签在脚本的底部打开,然后在每本书中迭代,创建图书标签和所有内部标题、作者和出版商标签。
这种方法的问题是编码的实体。确保实体的代码是正确的,你必须调用htmlentities函数对每一个项目,如清单8所示。
清单8。使用htmlentities函数编码的实体
复制代码代码如下所示:

< PHP
foreach($书达书)
{
标题= htmlentities($书$ {标题},ent_quotes);
作者= htmlentities($美元书{ 'author},ent_quotes);
美元($书出版商= htmlentities 'publisher{ },ent_quotes);
>






< PHP
}
>



这是用基本的PHP编写XML的烦恼。您认为您已经创建了完美的XML,但是当您尝试使用数据时,您很快就会发现一些元素没有正确编码。
--------------------------------------------------------------------------------
结语
总是有很多XML夸张和混乱。但它不是你想的-尤其是在一个好的语言如PHP一样困难。经过了解和实现XML的正确,有许多功能强大的工具,可以used.xpath和XSLT是两个值得研究的工具。