PHP不能在XML文件

时间:2017-12-07 09:05:45

标签: php xml

我试图使用PHP从XML文件中删除某些节点,由于某些原因它无法正常工作,我得出的结论可能就是这种情况,因为PHP没有返回正确的数字节点,在所述XML文件中。

这是XML文件:

<?xml version="1.0"?>
<Filenames>
    <newFile>
        <link>somelink</link>
        <ViewLink>someotherlink</ViewLink>
        <FileName>test</FileName>
    </newFile>
    <newFile>
        <link>somelink</link>
        <ViewLink>someotherlink</ViewLink>
        <FileName>test</FileName>
    </newFile>
</Filenames>

......依此类推(文件更长,但我总是对节点等使用相同的名称,你明白了)

由于删除某些节点无法解决问题,我尝试首先从xml文件中获取信息,然后尝试检查PHP可以查找的节点数<newFile>(我想要删除的节点) 。 为此,我做了以下事情:

<?php
    $doc = new DOMDocument();
    $doc->load("FilenameList.xml");

    $root = $doc->documentElement;

    $newFiles = $root->getElementsByTagName("newFile");
    echo count($newFiles);
?>

但是,返回&#34; 1&#34;,尽管显然有更多的节点。 我还尝试使用simpleXML计算<newFile>个节点的数量,但同样,它不起作用。我对此感到非常困惑,因为我过去使用了相同的语法并且完美地完成了。 我尝试的另一件事是这样做:

$newFiles = $doc->getElementsByTagName("newFile");

而不是$root = ...

此外,我还尝试使用sizeof()代替count()。 我错过了什么或有没有人知道出了什么问题?

2 个答案:

答案 0 :(得分:2)

DOMDocument::getElementsByTagName函数返回类DOMNodeList的新实例。在提出问题时,这样的班级有以下签名:

DOMNodeList implements Traversable {
    /* Properties */
    readonly public int $length ;
    /* Methods */
    DOMNode DOMNodelist::item ( int $index )
}

该类实现了Traversable接口(因此您可以foreach ()),但不是Countable接口,这将允许count()生成有用的东西。

解决方案是您可以在类签名中看到的$length属性:

  

length

     

列表中的节点数。有效子节点索引的范围   是0到长度 - 包括1。

PHP/7.2.0开始,最终实现了Countable接口:

  

<强> DOM:

     

实现了FR #74837(为DomNodeList实现了Countable和   DOMNamedNodeMap)。

当前版本的文档是:

DOMNodeList implements Traversable , Countable {
    /* Properties */
    readonly public int $length ;
    /* Methods */
    public int count ( void )
    DOMNode item ( int $index )
}

...原始代码应该最终有用。

答案 1 :(得分:1)

$doc = new DOMDocument;
$doc->loadXML("FilenameList.xml");
$newFiles = $doc->getElementsByTagName('newFile');
foreach ($newFiles as $newFile) {
   $newFile++;
}
echo $newFile;

你忘记了foreach循环。请检查此http://php.net/manual/en/domdocument.getelementsbytagname.php