위치를 유지하면서 노드를 교체하기 위해 domxpath를 사용합니다.
-
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 그 순간을 어떻게 그리워 했는가 :)