【问题标题】:PHP XML Reader - Put Values into ArrayPHP XML 阅读器 - 将值放入数组
【发布时间】:2011-08-20 06:32:07
【问题描述】:

在上一个问题中,我询问了如何从 XML 文件中提取值并将它们放入数组中。

PHP xmlreader - values to array question

当使用 simpleXML 时,我无法读取 XML 文件而不返回错误。我只能假设 XML 文件包含一些错误字符,因为该文件已使用 PHP XMLreader 成功读取,并且编码设置为 ISO-8859-1。

理想情况下,我想使用 simpleXML,因为循环看起来更简单,但 XMLreader 似乎可以工作。

  1. 有没有办法为 simpleXML 设置 XML 文件的编码?

2。如果使用 XMLreader,如何修改我之前问题中的代码,仅在找到元素中的特定值时才向数组添加值?

示例:来自previous question 的当前代码获取所有idusername
你如何获得id和用户名only when [ title ] = value

<!-- XML File -->
<?xml version="1.0" encoding="UTF-8"?>
<working version="2.0">
<group name="test">
    <userdata>
        <title>data</title>
        <id>data</id>
        <username>data</username>
            </userdata>
     </group>
</working>

【问题讨论】:

    标签: php xmlreader


    【解决方案1】:

    除了SimpleXML,没有其他方法可以使用UTF-8。但是,由于SimpleXML 只是使用DOM 的一种更简单的方法,您可以改用DOM。事实上,你想要的在DOM 中会很简单。将 '%%something%%' 更改为您想要匹配的内容(例如,'administrator')。

    <?php
        $xml = new DOMDocument( "1.0", "ISO-8859-1" );
        $xml->load("path/to/file.xml");
    
        $xpath = new DOMXPath( $xml );
        $nodes = $xpath->query( "/working/group/userdata[ title = '%%something%%' ]" );
    
        $array = array();
        foreach( $nodes as $k => $node )
        {
            foreach( $node->childNodes as $cnode )
            {
                $array[ $k ][ $cnode->nodeName ] = $cnode->textContent;
            }
        }
    ?>
    

    请注意:DOMSimpleXML 都将整个文档加载到内存中,然后才能对其进行处理。因此,如果您的文档大于 PHP 的可用内存(参见 memory_limit 的 ini 设置),则在这些极端情况下您将需要使用 XMLReader 或 XMLWriter。

    另外请注意,我没有对此进行测试,但它应该非常接近您的需要。如果您还想要一个这样的 XMLReader 示例,请告诉我。对我来说使用 DOM 更快:P

    【讨论】:

    • 一个 XMLReader 示例会很有趣。有人建议使用 xml_set_object。我真的不知道在使用解析器/阅读器提取特定元素的情况下这将如何工作。感谢 DomXPath 示例。
    • @rrfusco:我的XMLReader::foo 有点生疏了。但是,鉴于您之前的回答,我的直接猜测是您需要像当前一样读取 xml,但将数据存储到临时数组中。然后,在获得当前的userdata 后,检查$tmp['title'] === 'administrator',如果是,则将该数据保存到主数据数组中。这有意义吗?
    猜你喜欢
    • 2013-07-01
    • 1970-01-01
    • 2014-01-30
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多