解析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() | 检查当前元素是否有效。 |