2017-12-07 9 views
1

何らかの理由でPHPを使用してXMLファイルから特定のノードを削除しようとしていますが、これはおそらくケースであると結論づけましたこれは、PHPが正しいXMLファイル数のノードを返さないためです。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ファイルから情報を取得しようとしましたが、<newFile>(削除したいノードです)のノードでPHPが見つけることができました。 があることを行うために、私は次のことをやった:

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

    $root = $doc->documentElement; 

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

しかし、明らかに、道より多くのノードが存在するにもかかわらず、「1」が返されます。 私はまた、<newFile>ノードの量をsimpleXMLを使って数えてみましたが、やはり動作しませんでした。私はこれで非常に混乱しています。私は過去に同じ構文を使用していたので、完璧に機能しました。 私が試したもう一つは、これを実行することでした。また

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

代わりの$root = ...

、私はまたsizeof()代わりのcount()を使用してみました。 何か不足していますか?誰かが間違っていることについて考えていますか?

+0

これは 'echo $ newFiles-> length'、' count() 'のような' - > length'属性を使って、適切な関数ではありません – Ghost

+0

ah愚かな間違い、実際にはより大きな間違いがあることを期待していたので、なぜ削除がうまくいかなかったのか分かりました。どうもありがとうございました ! –

答えて

2

DOMDocument::getElementsByTagName関数は、クラスDOMNodeListの新しいインスタンスを返します。

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

この機能はcount()が有用な何かを生産することが可能になるTraversableインターフェース(あなたがそれをforeach()することができます)ではなくCountableインタフェースを実装します。リスト内のノードの

length

数:

ソリューションは、クラスのシグネチャで見ることができる$lengthプロパティです。有効な子ノードインデックス の範囲は、0〜length-1です。

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


あなたはforeachループを忘れてしまった。これをチェックする

関連する問題