위치를 유지하면서 노드를 교체하기 위해 domxpath를 사용합니다.

StackOverflow https://stackoverflow.com/questions/640815

  •  22-07-2019
  •  | 
  •  

문제

좋아, 그래서 나는 다른 밤 에이 깔끔한 작은 아이디어를 가졌다. CSS 선택기 대신 XPath가 사용됩니다. 예를 들어:

$Xml->load($source)
    ->path('//root/items')
    ->each(function($Context)
    {
        echo $Context->nodeValue;
    });

이것은 모든 결과 노드에서 콜백 함수를 호출합니다. 불행히도, PHP 버전 <5.3.x는 Lambda 기능이나 클로저를 지원하지 않으므로 당분간 이와 비슷한 일을해야합니다.

$Xml->load($source)
    ->path('//root/items')
    ->walk('printValue', 'param1', 'param2');

현재 모든 것이 잘 작동하고 있으며이 프로젝트는 많은 사람들에게 유용 할 것이라고 생각하지만 저는 기능 중 하나에 붙어 있습니다. jQuery의 '교체'방법을 모방하려고합니다. 다음 코드를 사용하여 다음 방법을 적용하여이를 쉽게 달성 할 수 있습니다.

$Xml->load($source)
    ->path('//root/items')
    ->replace($Xml->createElement('foo', 'bar')); // can be an object, string or XPath pattern

이 방법 뒤에있는 코드는 다음과 같습니다.

public function replace($Content)
{
    foreach($this->results as $Element)
    {
        $Element->parentNode->appendChild($Content->cloneNode(true));
        $Element->parentNode->removeChild($Element);
    }

    return $this;
}

이제 이것은 작동합니다. 모든 결과 요소를 복제 된 버전의 $ 컨텐츠로 대체합니다. 문제는 부모 노드의 어린이 목록의 맨 아래에 추가한다는 것입니다. 문제는 다른 요소를 대체하기 위해이 요소를 어떻게 복제하고, 여전히 DOM의 원래 위치를 유지 하는가?

나는 교체해야 할 노드를 리버스 엔지니어링하는 것에 대해 생각하고있었습니다. 기본적으로 $ 컨텐츠에서 값, 속성 및 요소 이름을 복사하지만 대상 요소의 실제 요소 이름을 변경할 수는 없습니다.

성찰은 가능성이있을 수 있지만 더 쉬운 방법이 있어야합니다.

아무도?

도움이 되었습니까?

해결책

AppendChild/RemoveChild 대신 REPLACECHILD를 사용하십시오.

다른 팁

조회 $ 요소가 제거하기 전에 NexTsibbling이있는 경우 다음 형제가 간단하게 추가되기 전에 삽입되면 삽입됩니다.

public function replace($Content)
{
        foreach($this->results as $Element)
        {
                if ($Element->nextSibling) {
                    $NextSiblingReference = $Element->nextSibling;
                    $Element->parentNode->insertBefore($Content->cloneNode(true),$NextSiblingReference);
                }
                else {
                    $Element->parentNode->appendChild($Content->cloneNode(true));   
                }
                $Element->parentNode->removeChild($Element);
        }

        return $this;
}

그래도 완전히 테스트되지 않았습니다.

또는 Anthonywjones가 제안한대로 교체용 , 큰 oomph 그 순간을 어떻게 그리워 했는가 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top