2017-12-07 1 views
1

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> (삭제하려는 노드)을 확인하려고했습니다. 비록, 분명히, 방법 이상의 노드가 "1"을 반환하는, 그러나

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

    $root = $doc->documentElement; 

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

: 그렇게하기 위해, 나는 다음을했다. 또한 simpleXML을 사용하여 <newFile> 노드의 양을 계산했지만 다시 작동하지 않았습니다. 나는 이것으로 매우 혼란 스럽다. 과거에 같은 문법을 사용했기 때문에 완벽하게 해결되었다. 해봤 또 다른 한가지는이 작업을 수행하는 것이 었습니다 : 또한

$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에서 길이 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

관련 문제