PHP中使用xmlreader读取xml数据详细解释

PHP中使用xmlreader读取xml数据详细解释

 2016-12-28 10:14

之前,我在《PHP有专门解析XML的方法》中提到XMLReader可以很好的读取XML的数据。今天我又详细的研究了下,发现这个功能的确很强大,分享一个案例给大家。

使用的是zblogPHP系统,它可以自动生成一个feed.php的文件,通过读取它我们做了一个测试。先附上XML代码:

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
    <channel>
        <title>拍拍看科技</title>
        <link>http://blog.limiwu.com/</link>
        <description>关注科技产品和个人博客发展,注重用户体验和界面优化</description>
        <item>
            <title>新购买了一个域名:losehub.com</title>
            <link>http://blog.limiwu.com/537.html</link>
            <description>最近新购买了一个域名losehub.com。准备来做一个PHP项目,
            具体的还在谋划中。不知道什么时候能开始制作呢。</description>
            <pubDate>Tue, 27 Dec 2016 14:47:25 +0800</pubDate>
        </item>
        ...
    </channel>
</rss>

我用PHP做了一个简单的方法来读取<item>里面的内容。情况如下:

<?php
$indexUrl='http://blog.limiwu.com/feed.php';  
$reader = new XMLReader();  
$reader->open($indexUrl);  
$countElements = 0;  
 
while ($reader->read()){  
        if($reader->nodeType == XMLReader::ELEMENT){  
            $nodeName = $reader->name;  
        }  
        if($reader->nodeType == XMLReader::TEXT && !empty($nodeName)){  
            switch($nodeName){  
                case 'title':
                if ($reader -> depth == '4'){
                    $title = $reader->value;
                    }
                    break;   
                case 'link':
                if ($reader -> depth == '4'){
                    $link = $reader->value;
                    }
                    break;  
                case 'description':  
                    $description = $reader->value;  
                    break;  
                case 'pubDate':  
                    $pubDate = $reader->value;  
                    break;  
            }  
        }  
 }  
$reader->close();

echo $title.'<br />';
echo $link.'<br />';
echo $description.'<br />';
echo $pubDate;

?>

大体思路是这样的:XMLReader是按节点来读取数据的,所以我们可以直接寻找到需要的节点。虽然我们这里有两个不同的title和link,但因为赋值原则,值输出的还是最后赋予的。

这只是一个小小的输出,主要是用来理解XMLReader的用法的,具体的内容还需要大家自行完善。附上XMLReader常用手法、属性和常量等信息,方便大家查找使用。

XMLReader常量:

XMLReader::NONE = 0 ;
XMLReader::ELEMENT = 1 ;
XMLReader::ATTRIBUTE = 2 ;
XMLReader::TEXT = 3 ;
XMLReader::CDATA = 4 ;
XMLReader::ENTITY_REF = 5 ;
XMLReader::ENTITY = 6 ;
XMLReader::PI = 7 ;
XMLReader::COMMENT = 8 ;
XMLReader::DOC = 9 ;
XMLReader::DOC_TYPE = 10 ;
XMLReader::DOC_FRAGMENT = 11 ;
XMLReader::NOTATION = 12 ;
XMLReader::WHITESPACE = 13 ;
XMLReader::SIGNIFICANT_WHITESPACE = 14 ;
XMLReader::END_ELEMENT = 15 ;
XMLReader::END_ENTITY = 16 ;
XMLReader::XML_DECLARATION = 17 ;
XMLReader::LOADDTD = 1 ;
XMLReader::DEFAULTATTRS = 2 ;
XMLReader::VALIDATE = 3 ;
XMLReader::SUBST_ENTITIES = 4 ;

XMLReader方法:

a、XMLReader::XML
作用:载入 xml 字符串
用法:XMLReader::xml(string source [, string encoding [, int options]] )
参数:source,xml string;encoding,document encoding or NULL
返回:如果成功则返回 TRUE,失败则返回 FALSE。

b、XMLReader::open
作用:载入xml文件
用法:XMLReader::open(string url [, string encoding [, int options]] )
参数:url,连接到xml的链接;encoding,document encoding or NULL
返回:如果成功则返回 TRUE,失败则返回 FALSE。

c、XMLReader::read
作用:读取 xml,使解析器前进到下一个标记
用法:XMLReader::read(),在 while 循环中遍历整个文档
参数:NULL
返回:如果成功则返回 TRUE,失败则返回 FALSE。

d、XMLReader::getAttribute
作用:获取属性
用法:XMLReader::getAttribute(string name)
参数:name,属性名称
返回:如果成功则返回 属性值,失败则返回 FALSE。

e、XMLReader::isValid
作用:检验xml是否合法
用法:XMLReader::isValid()
参数:无
返回:如果成功则返回 true,失败则返回 FALSE。

f、XMLReader::moveToAttribute
作用:移动焦点到所指的属性上
用法:XMLReader::moveToAttribute(string name)
参数:name,属性名称
返回:如果成功则返回 true,失败则返回 FALSE。

g、XMLReader::moveToFirstAttribute
作用:移动焦点到第一个属性上
用法:XMLReader::moveToFirstAttribute()
参数:无
返回:如果成功则返回 true,失败则返回 FALSE。

h、XMLReader::moveToNextAttribute
作用:移动焦点到下一个属性上
用法:XMLReader::moveToNextAttribute()
参数:无
返回:如果成功则返回 true,失败则返回 FALSE。

i、XMLReader::moveToElement
作用:移动焦点到父节点当前属性上
用法:XMLReader::moveToElement()
参数:无
返回:如果成功则返回 true,失败则返回 FALSE。

j、XMLReader::close
作用:关闭xml输入
用法:XMLReader::close()
参数:无
返回:如果成功则返回 true,失败则返回 FALSE。

XMLReader属性:

a、XMLReader->attributeCount ;
作用:属性数量

b、XMLReader->baseURI ;
作用:节点的url

c、XMLReader->depth ;
作用:节点树的层数

d、XMLReader->hasAttributes ;
作用:检测是否有属性

e、XMLReader->hasValue ;
作用:是否有值

f、XMLReader->isEmptyElement ;
作用:是否是空标签

g、XMLReader->localName ;
作用:标签内部明

h、XMLReader->name ;
作用:标签名

i、XMLReader->nodeType ;
作用:节点类型

j、XMLReader->value ;
作用:节点文本内容


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用DOM(文档对象模型)读取XML数据需要以下步骤: 1. 创建DocumentBuilderFactory实例 ``` DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); ``` 2. 创建DocumentBuilder实例 ``` DocumentBuilder builder = factory.newDocumentBuilder(); ``` 3. 解析XML文件并返回Document对象 ``` Document document = builder.parse(new File("example.xml")); ``` 4. 获取根节点 ``` Element rootElement = document.getDocumentElement(); ``` 5. 遍历子节点获取需要的信息 ``` NodeList nodeList = rootElement.getElementsByTagName("book"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String title = element.getElementsByTagName("title").item(0).getTextContent(); String author = element.getElementsByTagName("author").item(0).getTextContent(); String price = element.getElementsByTagName("price").item(0).getTextContent(); System.out.println("Title: " + title); System.out.println("Author: " + author); System.out.println("Price: " + price); } } ``` 完整代码示例: ```java import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XMLReader { public static void main(String[] args) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("example.xml")); Element rootElement = document.getDocumentElement(); NodeList nodeList = rootElement.getElementsByTagName("book"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String title = element.getElementsByTagName("title").item(0).getTextContent(); String author = element.getElementsByTagName("author").item(0).getTextContent(); String price = element.getElementsByTagName("price").item(0).getTextContent(); System.out.println("Title: " + title); System.out.println("Author: " + author); System.out.println("Price: " + price); } } } catch (Exception e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值