1. 程式人生 > >XML數據格式

XML數據格式

exc 數據格式 標記 oot mysql 之間 append 數據 節點類

XML: 可擴展的標記語言(用戶自定義的標記語言)

  用途:數據跨平臺的存儲,傳輸,共享的;在不同的語言之間也可以通信

XML基本語法格式:

  文件擴展名必須以.xml結束(.html)

  xml中第一個標簽叫文檔標簽

    <?xml version=”1.0” encoding=”utf-8”?>

    Version:xml版本是1.0

    Encoding:xml文檔編碼

  xml中所有的標簽都是用戶自定義的,且區分大小寫

    <div></DIV> != <DIV></DIV> <div></div> <hr/><br/>

  xml中所有的標簽都是成對出現了,有開始,必須有結束,除非中間沒有內容,可以使用單標簽來代替 <br/> <hr/>

    <student></student> = <student/>

  xml文件中有且只有一個最大的根節點。

  xml中嵌套必須合理,且每一個節點有且只有 一個直接的父級節點。

    <div><p></p></div>  <student><age></age></studetn>

  xml中的空格保留,不能隨便亂打空格。

    <div></div>  <p></p >   #這裏p後面多個空格系統就無法識別了#

  xml中的屬性必須使用單引號和雙引號括起來。

    <font size="2"></font>

XML用途:

  RSS訂閱/xml訂閱 - 基本不用了

  百度地圖(百度標簽定義) .xml

  第三方平臺api接口的提交和返回值, xml格式的數據和json格式

Thinksite

Student

Sid  sname  addr  age

1001  tom   UK   30

1002  lily   USA   25

  【Student.xml】

<?xml version="1.0" encoding="utf-8"?>
<thinksite>
    <student>
        <stu>
            <sid>1001</sid>
            <sname>tom</sname>
            <addr>UK</addr>
            <age>30</age>
        </stu>
        <stu>
            <sid>1002</sid>
            <sname>lily</sname>
            <addr>USA</addr>
            <age>25</age>
        </stu>
    </student>
</thinksite>

XML生成:

  字符串的鏈接:

  【sutdent.php】

<?php
$dsn = "mysql:host=localhost;dbname=thinkshop";
$user= "root";
$pwd = "123456";

try{
    $pdo = new PDO($dsn,$user,$pwd);
}catch(PDOException $e){
    echo $e -> getMessage();
}

$pdo -> exec("set names utf8");
$sql = "select * from marks";
$result = $pdo -> query($sql);
$result -> setFetchMode(PDO::FETCH_ASSOC);
$data =  $result-> fetchAll();

$xml = "<?xml version=‘1.0‘ encoding=‘utf-8‘?>";
$xml .= "<thinkshop>";
$xml .= "<marks>";

foreach($data as $key=>$vo){
    $xml .= "<records>";
    foreach($vo as $k=> $v)
        $xml .= "<{$k}>".$v."</$k>";
    $xml .= "</records>";
}

$xml .= "</marks>";
$xml .= "</thinkshop>";

$fp = fopen("markxml.xml","w");
fwrite($fp,$xml);
fclose($fp);

DOM生成:

  $dom = new DOMDocument(版本號, 編碼)

  $dom -> createElement("創建元素節點");

  $dom -> createTextNode("創建文本節點");

  $dom節點對象 -> setAttribute("屬性名","值");

  節點 -> appendChild(子節點) 將子節點,追加到節點上

  Save(文件名): 將domxml對象保存成某個文件

  Savexml():使用dom生成xml內容的字符串

  【marks.php】

<?php
$dsn = "mysql:host=localhost;dbname=thinkshop";
$user= "root";
$pwd = "";

try{
    $pdo = new PDO($dsn,$user,$pwd);
}catch(PDOException $e){
    echo $e -> getMessage();
}

$pdo -> exec("set names utf8");
$sql = "select * from marks";
$result = $pdo -> query($sql);
$result -> setFetchMode(PDO::FETCH_ASSOC);
$data =  $result-> fetchAll();

$dom = new DomDocument("1.0","utf-8");
$root = $dom -> createElement("thinkshop");
$dom -> appendChild($root);
$marks = $dom -> createElement("marks");
$root -> appendChild($marks);

foreach($data as $vo){
    $records = $dom -> createElement("records");
    $marks->appendChild($records);
    foreach($vo as $k=>$v){
        $nodes = $dom -> createElement($k);
        $nodes -> setAttribute("name","s");
        $records -> appendChild($nodes);
        $nodes_text = $dom -> createTextNode($v);
        $nodes -> appendChild($nodes_text);
    }
}

$dom -> save("domxml.xml");
?>
<a href="./domxml.xml">xml訂閱</a>

XML的發布:

  就是在外部網站中使用a鏈接,將需要發布的xml文件,做a鏈接指向就行。

XML的解析: 將xml文件解析成網頁或者得到需要的數據格式。

  simplexml解析: php內置的一個xml解析擴展類庫(默認開啟了)

  children(): 返回某個simplexml節點對象的所有子節點對象。

  simplexml_load_stirng(xml內容字符串): 將xml字符串轉換成simplexml節點對象

  【marks1.php】

<?php
$dsn = "mysql:host=localhost;dbname=thinkshop";
$user= "root";
$pwd = "";

try{
    $pdo = new PDO($dsn,$user,$pwd);
}catch(PDOException $e){
    echo $e -> getMessage();
}

$pdo -> exec("set names utf8");
$sql = "select * from marks";
$result = $pdo -> query($sql);
$result -> setFetchMode(PDO::FETCH_ASSOC);
$data =  $result-> fetchAll();

$xml = "<?xml version=‘1.0‘ encoding=‘utf-8‘?>";
$xml .= "<thinkshop>";
$xml .= "<marks>";
foreach($data as $key=>$vo){
    $xml .= "<records>";
    foreach($vo as $k=> $v)
        $xml .= "<{$k}>".$v."</$k>";
    $xml .= "</records>";
}

$xml .= "</marks>";
$xml .= "</thinkshop>";

// 就是將xml內容取出具體的數據信息,這種操作就是xml解析.

$simple = simplexml_load_string($xml);
foreach($simple ->children() as $vo){
    foreach($vo ->children() as $v){
        echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark;
        echo "<hr/>";
    }
}

  Simplexml_load_file(文件路徑+文件名): 將xml文件讀取轉換成simplexml節點對象

  【marks2.php】

<?php
$file = "domxml.xml";
// 就是將xml內容取出具體的數據信息,這種操作就是xml解析.
$simple = simplexml_load_file($file);
foreach($simple ->children() as $vo){
    foreach($vo ->children() as $v){
        echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark; 
        echo "<hr/>";
    }
}
?>

  Simplexml_import_dom(): 將DOM對象DOM節點對象轉換成simplexml節點對象。

  【marks3.php】

<?php
$dsn = "mysql:host=localhost;dbname=thinkshop";
$user= "root";
$pwd = "";

try{
    $pdo = new PDO($dsn,$user,$pwd);
}catch(PDOException $e){
    echo $e -> getMessage();
}

$pdo -> exec("set names utf8");
$sql = "select * from marks";
$result = $pdo -> query($sql);
$result -> setFetchMode(PDO::FETCH_ASSOC);
$data =  $result-> fetchAll();
$dom = new DomDocument("1.0","utf-8");
$root = $dom -> createElement("thinkshop");
$dom -> appendChild($root);
$marks = $dom -> createElement("marks");
$root -> appendChild($marks);

foreach($data as $key=>$vo){
    $records = $dom -> createElement("records");
    $marks->appendChild($records);
    foreach($vo as $k=>$v){
        $nodes = $dom -> createElement($k);
        $nodes -> setAttribute("name","s");
        $records -> appendChild($nodes);
        $nodes_text = $dom -> createTextNode($v);
        $nodes -> appendChild($nodes_text);
    }
}

// 就是將xml內容取出具體的數據信息,這種操作就是xml解析.

$simple = simplexml_import_dom($dom);
foreach($simple ->children() as $vo){
    foreach($vo ->children() as $v){
        echo $v -> mid."/".$v->sid."/".$v->cid."/".$v->mark;
        echo "<hr/>";
    }
}
?>

DOM解析: PHP內置的一個使用DOM解析xml的擴展類庫

  創建DOM對象:

    $dom = new DomDocument();

    $dom -> load(“文件/字符串”): 將xml文件或者是字符串加載成dom對象

  $root = $dom -> documentElement

  遍歷內部所有節點

    childNodes:返回的是某個節點下的所有的子節點

    getAttribute();

    NodeType

    Nodevalue

  xml層級比較多,遍歷時很麻煩,這個時候再simplexml中提供了xpath定位,在dom中有getElementByTagName() 方法。

  【dom.php】

<?php
 $file = "domxml.xml";
 $dom = new DomDocument();
 $dom -> load($file);
 $root = $dom -> documentElement;
 foreach($root->childNodes as $vo){
     foreach($vo->childNodes as $v){
          foreach($v->childNodes as $v1){
            if($v1 -> nodeType ==1){
                echo $v1 -> nodeValue;
            }
            echo "<hr/>";
          }
     }
 }
 // 層級太多,使用xpath
 $objs = $dom -> getElementsByTagName("records");
 foreach($objs as $vo){
     foreach($vo -> childNodes as $v){
        if($v -> nodeType ==1){
            echo $v -> nodeValue;
        }
     }
 }
?>

css解析:就是使用css,將xml內容解析成需要的網頁樣式(XSL)。

  <?xml-stylesheet type="text/css" href="cssfile"?> 使用標簽選擇器比較多。

  xmlreader(xmlwriter):PHP內置的一個xml解析擴展類庫

  Simplexml和dom都是將xml內容一次性讀入內存中進行解析。缺點就是如果文件很大,那麽浪費資源很嚴重,且速度很慢。

  Xmlreader可以邊加載,邊讀取xml內容,對於大文件xml解析是一種較好的解決方法.

    創建xmlreader對象。

    $reader = new XmlReader();

  打開xml文件

    $reader -> open(“xml文件”);

  讀取xml內容

    $reader -> read();從xml文件一個個的挨著讀取內容,每讀取一條內容就跳轉到下一條,直到沒有內容,就會報出false錯誤。(php文件按行讀取)

  nodeType:返回的是節點類型

    xmlReader::ELEMENT 元素節點

    xmlReader::TEXT 文本節點

    Name: 返回某個節點的標簽名

    Value: 返回某個節點的文本內容

  expand():讀取一個節點轉變為dom節點對象

XML數據格式