Самый простой способ, который я могу подумать, если использовать XPath для проверки, существует ли уже узел.
Предполагая, что вы будете использовать только 1 элемент для сопоставления (возможно больше, но намного сложнее). Сначала извлекается значение из нового узла, а затем используется XPath, чтобы проверить, существует ли уже совпадающее значение в текущих данных.
Главное в этом процессе - убедиться, что вы используете правильный контекст для поиска. По сути, это то, что нужно для поиска: сначала используется новый элемент, а затем текущий, чтобы проверить его.
function prop_list_contains(DOMXPath $xp, $properties_node, $prop,
array $required_matches){
// Extract value from new node
$compare = $xp->evaluate('string(@'.$required_matches[0].')', $prop);
// Check for the value in the existing data
$xpath = 'boolean(./property[@'. $required_matches[0] . ' = "' . $compare . '"])';
return ( $xp->evaluate($xpath, $properties_node) );
}
Это также означает, что вам нужно создать объект XPath для передачи ...
$xp = new DOMXPath($dom);
это сохраняет его создание каждый раз.
Также, поскольку это возвращает true
, если узел существует, вам нужно изменить свой тест, чтобы использовать !
...
if( ! prop_list_contains($xp, $properties_node,$prop,['name'])) {
$properties_node->appendChild($prop);
}
else {
echo "not adding element, found\n";
}