xml文件是一種數據存儲格式,下面小編給大家介紹php解析xml格式文件的多種方法總結介紹,DOMDocument是我們常用的解析xml一個不錯的方法,下面我來給大家總結總結.
DOMElement:DOMElement DOMDocument::createElement ( string $name [, string $value ] )
創建節點元素:
String $name:節點名
String $value:節點的值
添加節點:
•DOMNode DOMNode::appendChild ( DOMNode $newnode )
添加子節點:
DOMNode $newnode:新節點
在dom操作中,增刪改操作必須依賴于父節點
保存:
•string DOMDocument::saveXML
保存至某個字符串中
•int DOMDocument::save ( string $filename )
保存至某個文件中
String $filename:文件名
刪除節點
•DOMNode DOMNode::removeChild ( DOMNode $oldnode )
刪除節點
DOMNode $oldnode:要刪除的節點
更新節點
•DOMNode DOMNode::replaceChild ( DOMNode $newnode , DOMNode $oldnode )
DOMNode $newnode:新節點
DOMNode $oldnode:原節點
添加屬性
•DOMAttr DOMElement::setAttribute( string $name , string $value )
string $name:屬性名
string $value:屬性值
修改屬性
DOMAttr DOMElement::setAttribute( string $name , string $value )
string $name:屬性名
string $value:屬性值
刪除屬性
•bool DOMElement::removeAttribute ( string $name )
string $name:要刪除的屬性名稱
獲取屬性
•string DOMElement::getAttribute ( string $name )
string $name:要獲取的屬性值的屬性名
DOMDocument還是PHP5后推出的DOM擴展的一部分,可用來建立或解析html/xml,目前只支持utf-8編碼,代碼如下:
- $xmlstring = <<<XML
- <?xml version='1.0'?>
- <document>
- <cmd attr='default'>login</cmd>
- <login>imdonkey</login>
- </document>
- XML;
- $dom = new DOMDocument();
- $dom->loadXML($xmlstring);
- print_r(getArray($dom->documentElement));
- function getArray($node) {
- $array = false;
- if ($node->hasAttributes()) {
- foreach ($node->attributes as $attr) {
- $array[$attr->nodeName] = $attr->nodeValue;
- }
- }
- if ($node->hasChildNodes()) {
- if ($node->childNodes->length == 1) {
- $array[$node->firstChild->nodeName] = getArray($node->firstChild);
- } else {
- foreach ($node->childNodes as $childNode) {
- if ($childNode->nodeType != XML_TEXT_NODE) {
- $array[$childNode->nodeName][] = getArray($childNode);
- }
- }
- }//開源代碼Vevb.com
- } else {
- return $node->nodeValue;
- }
- return $array;
- }
SimpleXML
SimpleXML是PHP5后提供的一套簡單易用的xml工具集,可以把xml轉換成方便處理的對象,也可以組織生成xml數據,不過它不適用于包含namespace的xml,而且要保證xml格式完整(well-formed),它提供了三個方法:simplexml_import_dom、simplexml_load_file、simplexml_load_string,函數名很直觀地說明了函數的作用,三個函數都返回SimpleXMLElement對象,數據的讀取/添加都是通過SimpleXMLElement操作,代碼如下:
- $string = <<<XML
- <?xml version='1.0'?>
- <document>
- <cmd>login</cmd>
- <login>imdonkey</login>
- </document>
- XML;
- $xml = simplexml_load_string($string);
- print_r($xml);
- $login = $xml->login;//這里返回的依然是個SimpleXMLElement對象
- print_r($login);
- $login = (string) $xml->login;//在做數據比較時,注意要先強制轉換
- print_r($login);
SimpleXML的優點是開發簡單,缺點是它會將整個xml載入內存后再進行處理,所以在解析超多內容的xml文檔時可能會力不從心,如果是讀取小文件,而且xml中也不包含namespace,那SimpleXML是很好的選擇.
XMLReader
XMLReader也是PHP5之后的擴展(5.1后默認安裝),它就像游標一樣在文檔流中移動,并在每個節點處停下來,操作起來很靈活,它提供了對輸入的快速和非緩存的流式訪問,可以讀取流或文檔,使用戶從中提取數據,并跳過對應用程序沒有意義的記錄.
以一個利用google天氣api獲取信息的例子展示下XMLReader的使用,這里也只涉及到一小部分函數,更多還請參考官方文檔,代碼如下:
- $xml_uri = 'http://www.google.com/ig/api?weather=Beijing&hl=zh-cn';
- $current = array();
- $forecast = array();
- $reader = new XMLReader();
- $reader->open($xml_uri, 'gbk');
- while ($reader->read()) {
- //get current data
- if ($reader->name == "current_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
- while($reader->read() && $reader->name != "current_conditions") {
- $name = $reader->name;
- $value = $reader->getAttribute('data');
- $current[$name] = $value;
- }
- }
- //get forecast data
- if ($reader->name == "forecast_conditions" && $reader->nodeType == XMLReader::ELEMENT) {
- $sub_forecast = array();
- while($reader->read() && $reader->name != "forecast_conditions") {
- $name = $reader->name;
- $value = $reader->getAttribute('data');
- $sub_forecast[$name] = $value;
- }
- $forecast[] = $sub_forecast;
- }
- }
- $reader->close();
XMLReader和XML Parser類似,都是邊讀邊操作,較大的差異在于SAX模型是一個“推送”模型,其中分析器將事件推到應用程序,在每次讀取新節點時通知應用程序,而使用XmlReader的應用程序可以隨意從讀取器提取節點,可控性更好.
由于XMLReader基于libxml,所以有些函數要參考文檔看看是否適用于你的libxml版本.
新聞熱點
疑難解答