SimpleXML

解析xml的三个函数

1、simplexml_load_string

SimpleXMLElement simplexml_load_string ( string $data [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = FALSE ]]]] ) 

参数:

$data 需要解析是xml字符串

$class_name  返回的对象名称,默认为SimpleXMLElement,如果不用默认值,只能填SimpleXMLElement或者它的子类类名,

如class XmlObj extends SimpleXMLElement{},则可以用XmlObj

$options 附加的 Libxml 参数。如 LIBXML_NOCDATA 将 CDATA 设置为文本节点,更多请参考菜鸟教程或者官方文档

$ns 和 $is_prefix略。很少用到,需要的看文档。

举例:

<?php
$xmlString = <<<XML
<?xml version='1.0'?>
<xml>
<ToUserName><![CDATA[gh_4e18f94837a2]]></ToUserName>
<FromUserName><![CDATA[oOqsb02X6xrpyVjaG85Nl2wK3nKY]]></FromUserName>
<CreateTime>1539008405</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[文本消息...]]></Content>
<MsgId>6609990768199199625</MsgId>
<user>
<name>老王</name>
<age>20</age>
</user>
</xml>
XML;
$data = simplexml_load_string($xmlString,'SimpleXMLElement',LIBXML_NOCDATA);
echo '<pre>';
print_r($data); 
?>

没有<?xml version='1.0'?>也可以运行,不影响运行结果。结果如下:

 去掉 LIBXML_NOCDATA 后, $data = simplexml_load_string($xmlString);结果如下

也可以用数组的方式,如

<?php
$xmlString = <<<XML
<?xml version='1.0'?>
<xml>
<ToUserName><![CDATA[gh_4e18f94837a2]]></ToUserName>
<FromUserName><![CDATA[oOqsb02X6xrpyVjaG85Nl2wK3nKY]]></FromUserName>
<CreateTime>1539008405</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[文本消息...]]></Content>
<MsgId>6609990768199199625</MsgId>
<user>
<name>老王</name>
<age>20</age>
</user>
</xml>
XML;
$data = simplexml_load_string($xmlString,'SimpleXMLElement',LIBXML_NOCDATA);
//把对象转数组
$json = json_encode($data);
$array = json_decode($json,TRUE);
echo '<pre>';
print_r($array);
?>

结果如下:

2、simplexml_load_file

SimpleXMLElement simplexml_load_file ( string $filename [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = FALSE ]]]] )

除了第一个参数 string $filename是xml文件的路径,其他的用法同simplexml_load_string

结果如下:

3、simplexml_import_dom

SimpleXMLElement simplexml_import_dom ( DOMNode $node [, string $class_name = "SimpleXMLElement" ] )

<?php
$dom = new DOMDocument;
$dom->loadXML('<books><book><title>blah</title></book><book><title>sleep</title></book></books>');
if (!$dom) {
    echo 'Error while parsing the document';
    exit;
}
$s = simplexml_import_dom($dom);
echo '<pre>';
print_r($s);
echo $s->book[0]->title;
?>

结果如下:

SimpleXMLElement

类摘要

SimpleXMLElement implements Traversable {

/* 方法 */

final public __construct ( string $data [, int $options = 0 [, bool $data_is_url = FALSE [, string $ns = "" [, bool $is_prefix = FALSE ]]]] )

public void addAttribute ( string $name [, string $value [, string $namespace ]] )

public SimpleXMLElement addChild ( string $name [, string $value [, string $namespace ]] )

public mixed asXML ([ string $filename ] )

public SimpleXMLElement attributes ([ string $ns = NULL [, bool $is_prefix = FALSE ]] )

public SimpleXMLElement children ([ string $ns [, bool $is_prefix = FALSE ]] )

public int count ( void )

public array getDocNamespaces ([ bool $recursive = FALSE [, bool $from_root = TRUE ]] )

public string getName ( void )

public array getNamespaces ([ bool $recursive = FALSE ] )

public bool registerXPathNamespace ( string $prefix , string $ns )

public string __toString ( void )

public array xpath ( string $path )

}

__construct  创建一个新的 SimpleXMLElement 对象,参数同simplexml_load_string 参数

例子:

<?php
$xmlString = <<<XML
<?xml version='1.0'?>
<users>
    <user>
        <name>老王</name>
        <age>20</age>
    </user>
    <user>
        <name>赵高</name>
        <age>35</age>
    </user>
    <user>
        <userName>张三</userName>
        <userAge>35</userAge>
        <sex>男</sex>
    </user>
</users>
XML;
$xmlObj = new SimpleXMLElement($xmlString);
echo '<pre>';
print_r($xmlObj);
?>

结果如下:

从结果看出,三个相同并且并列的标签(例子中的user),即使里面的结构内容不一样,也会成为同一个数组的元素.

public SimpleXMLElement attributes ([ string $ns = NULL [, bool $is_prefix = FALSE ]] )   获取 SimpleXML 元素的属性。

参数:略,一般没用到.需要的参考文档.

例子:

<?php
$string = <<<XML
<users>
    <user sex="男" age="20">张三</user>
    <user sex="男" age="25">李四</user>
</users>
XML;
$xml = simplexml_load_string($string);
echo '<pre>';
echo 'SimpleXMLElement对象为:<br/>';
print_r($xml);
echo '<br/>打印第一个元素:<br/>';
print_r($xml->user[0]);
echo '<br/>错误示范,获取不到属性:<br/>';
print_r($xml->user[0]->attributes);
echo '<br/>打印第二个元素:<br/>';
print_r($xml->user[1]);
echo '<br/>打印第1个元素属性:<br/>';
foreach($xml->user[0]->attributes() as $k => $v) {
    echo $k,'=>',$v,'<br/>';
}
?>

结果如下:

public mixed asXML ([ string $filename ] )

参数和返回值说明:

如果未指定文件名,则此函数在成功时返回字符串,并在错误时返回false。如果指定了参数,则该函数会把 XML 写入一个文件.如果文件被成功写入,则返回true,否则将返回false。

例子

<?php
$string = <<<XML
<a>
 <b>
  <c>text</c>
  <c>stuff</c>
 </b>
 <d>
  <c>code</c>
 </d>
</a>
XML;
$xml = new SimpleXMLElement($string);
echo $xml->asXML();
?>

结果如下

 public SimpleXMLElement children ([ string $ns [, bool $is_prefix = FALSE ]] )  获取指定节点的子

参数:略

返回值  SimpleXMLElement 对象

例1

<?php
$xmlString = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<note>
<to>George</to>
<from>John</from>
</note>
XML;
$xml = simplexml_load_string($xmlString);
echo '<pre>';
print_r($xml);

foreach ($xml->children() as $child)
{
    var_dump($child);
    echo "Child node: " . $child.'<br />';//用$child和$child[0]结果一样
}
?>

结果如下

例2

<?php
$xmlString = <<<XML
<person>
 <child role="son">
  <child role="daughter"/>
 </child>
 <child role="daughter">
  <child role="son">
   <child role="son"/>
  </child>
 </child>
</person>
XML;

$xml = new SimpleXMLElement($xmlString);
echo '<pre>';
//print_r($xml);
//print_r($xml->children());
foreach ($xml->children() as $second_gen) {
//    print_r($second_gen);
    echo ' The person begot a ' . $second_gen['role'];
    foreach ($second_gen->children() as $third_gen) {
        echo ' who begot a ' . $third_gen['role'] . ';';

        foreach ($third_gen->children() as $fourth_gen) {
            echo ' and that ' . $third_gen['role'] .
                ' begot a ' . $fourth_gen['role'];
        }
    }
}
?>

 结果如下

The person begot a son who begot a daughter; The person begot a daughter who begot a son; and that son begot a son

public string getName ( void )  获取 SimpleXML 元素的名称。

例子

<?php
$xmlString = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<people>
<student>学生</student>
<teacher>老师</teacher>
</people>
XML;

$sxe = new SimpleXMLElement($xmlString);
echo $sxe->getName() . "\n";

foreach ($sxe->children() as $child)
{
    echo $child->getName() . "\n";
}
?>

结果如下:

public array xpath ( string $path )   运行对 XML 文档的 XPath 查询。

参数:必须,XPath 路径。

如果成功,则返回包含 SimpleXMLElement 对象的一个数组。如果失败,则返回 false。

例1

<?php
$xmlString = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<people>
<student class="small">小学生</student>
<student class="medium">中学生</student>
<teacher>老师</teacher>
</people>
XML;

$xml = new SimpleXMLElement($xmlString);
$student = $xml->xpath("student");
echo '<pre>';
print_r($student);
$teacher = $xml->xpath("teacher");
print_r($teacher);
?>

结果:

例2

<?php
$string = <<<XML
<a>
 <b>
  <c>text</c>
  <c>stuff</c>
 </b>
 <d>
  <c>code</c>
 </d>
</a>
XML;

$xml = new SimpleXMLElement($string);
echo '<pre>';
/* Search for <a><b><c> */
$result = $xml->xpath('/a/b/c');
print_r($result);
foreach ($result as $k => $v){
    echo $k,'=>',$v,'<br/>';
}
$result = $xml->xpath('d/c');
print_r($result);
foreach ($result as $k => $v){
    echo $k,'=>',$v,'<br/>';
}
?>

结果如下:

个人总结:参数$path只能是 /跟节点A/A子节点B/B子节点C 或者 跟节点的子节点B/B的子节点C 这种格式,不支持 C节点/D节点这种格式

 public void addAttribute ( string $name [, string $value [, string $namespace ]] )

例子

<?php
$xmlString = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>张三</name>
<age>25</age>
</user>
XML;

echo '<pre>';
$xml = simplexml_load_string($xmlString);
echo '添加属性前:','<br />';
print_r($xml->name[0]);
$xml->name[0]->addAttribute("id", "name");

echo '<br />','打印属性','<br />';
foreach($xml->name[0]->attributes() as $a => $b)
{
    echo $a,'=>',$b,'<br />';
}
echo '<br />','添加属性后:','<br />';
print_r($xml->name[0]);
?>

结果如下:

public SimpleXMLElement addChild ( string $name [, string $value [, string $namespace ]] )

例子

<?php
$note=<<<XML
<users>
    <user>
        <name>张三</name>
        <age>20</age>
    </user>
</users>
XML;

$xml=new SimpleXMLElement($note);
$xml->user->addChild("sex","男");
$xml->addChild("user","李四 25 女");
echo $xml->asXML();
?>

结果如下:

张三 20 男 李四 25 女

SimpleXML 迭代函数

current() 返回当前元素。
getChildren() 返回当前元素的子元素。
hasChildren() 检查当前元素是否有子元素。
key() 返回当前键。
next() 移动到下一个元素。
rewind() 倒回到第一个元素。
valid() 检查当前元素是否有效。
发布了52 篇原创文章 · 获赞 54 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/weixin_37909391/article/details/82990905