用户名:  密码:   
您当前的位置:首页 > 网页设计 >  PHP > 

第22讲 XML声明行,处理行,注释,元素,标签名,属性,特殊字符输入,命名空间等基本要素和语法,用PHP创建xml文档,用smmpleXML解析,遍历,修改xml文档元素与属性,用DOM动态创建xml文档

上次修改时间: 2016-03-17 21:59:12      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\PHP相关\PHP入门到精通笔记\      下一页

XML声明行,处理行,注释,元素,标签名,属性,特殊字符输入,命名空间等基本要素和语法,用PHP创建xml文档,用smmpleXML解析,遍历,修改xml文档元素与属性,用DOM动态创建xml文档

22.1 XML的概述
1) XML(eXtensible Markup Language)扩展性标记语言,是用来描述其他语言的语言,由W3C1998年发布,前身是SGML
2) 它允许用户设计自己的标记,为补充Html语言的不足,Html以后不再更新,取代它的是XHTML
3) 易用性,可以用多种编辑器编写,如记事本
4) 结构性,具有层次结构,包括多层嵌套
5) 开放性,允许开发人员自定义标记
6) 分离性,将数据的显示和数据内容分开来保存,可高效搜索相关内容,忽略不相关部分

22.2 XML的语法
1) 基本的xml文档
<?xml version="1.0" encoding="gb2312" standalone="yes"?> //这里是声明,必须在第一行
<?xml-stylesheet type="text/css" href="Book.css"?> //这行是处理指令,即如何处理xml文档的指令
<!-- 下面的标签<计算机图书>就是这个xml文档的根目录  --> //这行是注释,注释符号同html一样,
<计算机图书> 
 <php>
  <书名>PHP程序开发范例宝典</书名>
  <价格 单位=“元/本”>89.00</价格>
  <出版时间>2007-09-01</出版时间>
 </php>
</计算机图书> 
2) xml文档的基本要素,上面xml文档的解释
a.  第一行是声明:声明必须在第一行,前面不许有空行,version="1.0"为xml版本,要放在声明第一位,<?xml和?>是xml声明开始和结束标记,
encoding="gb2312"是编码声明,默认使用utf-8;standalone="yes"是独立声明,yes表文档不依赖外部文档,为no表有可能依赖于某个外部文档,只是有可能
xml-stylesheet:样式表处理指令,指明该xml文档所使用的样式表
b. 第二行是处理指令:type="text/css"表设定文档使用的样式是css;href="Book.css"表设定了样式文件的地址 
c. 注释:注释不能出现在声明之前,也不能出现在元素中间,不能出现在属性列表,不能嵌套,内容中不能有--符号
d. 元素:元素必须要有开始标签,结束标签,数据内容三部分,没有数据的空元素标签也可简写,如:<标签/>
e. 标签名要求:英文标签名只能由下划线_和英文开头,且区分大小写;中文标签只能由_和中文开头
 //名称不能有除下划线_,连字符-,点.和冒号:外的其它符号,空格也不能有

3) xml属性,是xml元素中的内容,功能上和html标签的属性功能相似
格式:<标签 属性名=“属性值” 属性名=“”...>内容</标签>
 //属性名和属性值必须成对出现,像html中只有属性没值是不行的,不过值可以是空,如:属性名=“”
 //属性值要用双引号括起,如值中含有双引号就用单引号括
4) xml中对特殊字符的输入是通过使用实体引用来处理
a. 字符与实体对应,如: >实体是&lt;   >实体是&gt;   '实体是&apos;  "实体是&quot;  &实体是&amp;
b. 大量的特殊符号输入使用CDATA(Character data, 字符数据)标记,使用CDATA标记段里的内容被当作纯文本数据来看
 格式:<![CDATA[...]]>
5) 命名空间:通过在元素前加前缀保证元素和属性的唯一性,主要用来融汇不同的xml文档
 格式:<标签名称 xmlns:前缀名称="URL">
例子:
 <?xml version="1.0" encoding="GB2312"?>
 <exam>
  <实体引用>这里必须使用引用"&lt;"、“&gt;”、“&amp;”</实体引用>
  <CDATA标记>
  <![CDATA[
   这里可以正常输出“<”、“>”、“&”。
  ]]>
  </CDATA标记> 
 </exam>
例2:
 <?xml version="1.0" encoding="gb2312" standalone="yes"?>
 <外语图书 xmlns:frn="http://www.bccd.com/foreign">
  <frn:English>
   <frn:书名>许国璋英语</frn:书名>
   <frn:价格 货币种类="RMB" 单位="4本">80.00<frn:价格>
   <frn:出版时间>1996-05-10</frn:出版时间>
  </frn:English>
 <外语图书> 
 
22.3 在PHP中创建xml文档
1) PHP可生成动态页,也可生成xml文档,例:index.php加入如下代码
 header(Content-type:text/xml');
 echo '<?xml version="1.0" encoding="gb2312" ?>;
 echo '<计算机图书>';
 echo '<PHP>';
 echo '<书名>PHP项目开发全程实录</书名>;
 echo '<价格>85.00RMB</价格>';
 echo '<出版日期>2008-5-5</出版日期>';
 echo '</PHP>';
 echo '</计算机图书>';

 用smmpleXML创建函数,遍历子所有元素与属性,修改xml标签内容,用DOM动态创建xml文档
22.4 SimpleXML,其中主要包括一系列对xml文档读写和浏览的函数
1) PHP操作XML方法有多种,如xml语法解析函数,DOMXML函数和SimpleXML函数,其中Simple函数最简单
2) 创建SimpleXML对象,创建方法有3种
方法一:用Simplexml_load_file()函数,将指定文件解析到内存
方法二:用Simplexml_load_string()函数,将创建的字符串解析到内存
法三:用Simplexml_load_date()函数,将用dom函数创建domDocument对象导入到内存中
注:xml文档中设置的编码格式只针对xml文档,在html输出时也要设编码格式
例:要操作的xml文档代码:
 <?xml version='1.0' encoding='gb2312'?>
 <Object>
  <ComputerBook>
   <title>PHP从入门到精通</title>
  </ComputerBook>
 </Object>
例:PHP文档中代码
 /*第一种方法*/
 $xml_1 = simplexml_load_file("5.xml");
 print_r($xml_1);
 /*第二种方法*/
 $str = <<<XML
 <?xml version='1.0' encoding='gb2312'?>
 <Object>
  <ComputerBook>
   <title>PHP从入门到精通</title>
  </ComputerBook>
 </Object>
 XML;
 $xml_2 = simplexml_load_string($str);
 echo '<br>';
 print_r($xml_2);
 /*第三种方法*/
 $dom = new domDocument();
 $dom -> loadXML($str);
 $xml_3  = simplexml_import_dom($dom);
 echo '<br>';
 print_r($xml_3);
3) 遍历所有的子元素,使用SimpleXML对象中的children()方法和foreach循环遍历所有子节点元素
4) 遍历所有的属性, 使用SimpleXML对象中的attributes()方法,可遍历元素里的属性,用法同children()
5) 访问特定节点元素和属性,除上面遍历,还可访问特定的元素,或通过子元素名对该子元素赋值
例1:
 $str = <<<XML
 <?xml version='1.0' encoding='gb2312'?>
 <object>
  <book>
   <title>PHP从入门到精通</title>
  </book>
  <book>
   <title>PHP项目开发全程实录</title>
  </book>
 </object>
 XML;
 $xml = simplexml_load_string($str);
 foreach($xml->children() as $layer_one) {
  print_r($layer_once);
  echo '<br>';
  foreach($layer_once->children() as $layer_two) {
   print_r($layer_two);
   echo '<br>';
  }
 }
例2:
 $str = <<<XML
 <?xml version='1.0' encoding='gb2312'?>
 <object name='commodity'>
  <book type='computerbook'>
   <bookname name='PHP从入门到精通'/>
  </book>
  <book type='historybook'>
   <bookname name='上下五千年'/>
  </book>
 </object>
 XML;
 $xml = simplexml_load_string($str);
 foreach($xml->children() as $layer_one) {
  foreach($layer_once->attributes() as $name => $vl) {
   echo $name.'::'.$val;
  }
  echo '<br>';
  foreach($layer_one->children() as $layer_two) {
   foreach($layer_two->attributes() as $nm => $vl) {
    echo $nm.'::'.$vl;
   }
   echo '<br>';
  }
 }
例3:
 $str = <<<XML
 <?xml version='1.0' encoding='gb2312'?>
 <object name='商品'>
  <book>
   <computerbook>PHP从入门到精通</computerbook>
  </book>
  <book>
   <computerbook name='PHP项目开发全程实录' />
  </book>
 </object>
 XML;
 $xml = simplexml_load_string($str);
 echo $xml[name].'<br>';
 echo $xml->book[0]->computerbook.'<br>';
 echo $xml->book[1]->computerbook['name'].'<br>';
6) 修改xml数据,同读取相似,在访问特定元素和属性时也可以进行修改,例:
 header('Content-Type:text/html;charset=utf-8');
 $str = <<<XML
 <?xml version='1.0' encoding='gb2312'?>
 <object name='商品'>
  <book>
   <computerbook type='PHP入门应用'>PHP从入门到精通</computerbook>
  </book>
 </object>
 XML;
 $xml = simplexml_load_string($str);
 echo $xml[name].'<br />';
 $xml->book->computerbook['type'] = iconv('gb2312','utf-8','PHP程序员必备工具');
 $xml->book->computerbook = iconv('gb2312','utf-8','PHP程序员必备工具');
 echo $xml->book->computerbook['type'].' => ';
 echo $xml->book->computerbook;
例2:
 $xml = simplexml_load_file('10.xml');
 $xml->book->computerbook['type'] = iconv('gb2312','utf-8','PHP程序员必备工具');
 $xml->book->computerbook = iconv('gb2312','utf-8','PHP程序员必备工具');
 $modi = $xml->asXML();
 file_put_contents('10.xml',$modi);
 $str = file_get_contents('10.xml');
 echo $str;

22.5  动态创建xml文档
1) 由于SimpleXML只能读取和修改XML文档,不能动态创建XML,所以需要使用DOM
2) DOM(Document Object Model),文档对象模型,通过树形结构模式遍历xml文档,遍历的好处是不需要标记可显示全部内容,缺点是消耗内存
例:
 $dom = new DomDocument('1.0','gb2312');
 $object = $dom->createElement('object');
 $dom->appendChild($object);
 $book = $dom->createElement('book');
 $object->appendChild($book);
 $computerbook = $dom->createElement('computerbook');
 $book->appendChild($computerbook);
 $type = $dom->createAttribute('type');
 $computerbook->appendChild($type);
 $type_value = $dom->createTextNode('computer');
 $type->appendChild($type_value);
 $bookname = $dom->createElement('bookname');
 $computerbook->appendChild($bookname);
 $bookname_value = $dom->createTextNode(iconv('gb2312','uft-8','PHP从入门到精通'));
 $bookname->appendChild($bookname_value);
 echo $dom->saveXML();
//创建各个子节点,追加到computerbook下 ,最后输出