PHP: Проверьте, существует ли узел XML с атрибутом

Я нашел решение этой точной проблемы над здесь .

Мы должны настроить контекст для использования слотов перед подключением.

struct timeval timeout = { 1, 500000 }; // 1.5 seconds
redisClusterContext *cc = redisClusterContextInit();
redisClusterSetOptionAddNodes(cc, "172.16.129.68:6379");
redisClusterSetOptionConnectTimeout(cc, timeout);
redisClusterSetOptionRouteUseSlots(cc);  //The function that has to be called.
redisClusterConnect2(cc);
if (cc != NULL && cc->err) {
    printf("Error: %s\n", cc->errstr);
    // handle error
exit(-1);
}

7
задан Stefan Gehrig 31 March 2009 в 14:00
поделиться

4 ответа

Я предложил бы следующее (PHP, использующий ext/simplexml и XPath):

$name = 'Shiny Red';
$xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8"?>
<targets>
  <showcases>
    <building name="Big Blue" />
    <building name="Shiny Red" />
    <building name="Mellow Yellow" />
  </showcases>
</targets>');
$nodes = $xml->xpath(sprintf('/targets/showcases/building[@name="%s"]', $name);
if (!empty($nodes)) {
    printf('At least one building named "%s" found', $name);
} else {
    printf('No building named "%s" found', $name);
}
9
ответ дан 6 December 2019 в 15:32
поделиться

если я понимаю, что правильно, который не только тестирует первый узел?

Да. Таким образом, если Вы хотите использовать методы DOM как этот, необходимо будет сделать это в цикле. например:

$buildings= $xdoc->getElementsByTagName('building');
foreach ($buildings as $building)
    if ($building->getAttribute('name')==$name)
        return true;
return false;

С XPath можно устранить цикл, как отправлено Dimitre и sgehrig, но необходимо было бы быть осторожными, о каких символах Вы позволяете быть введенными в выражение XPath (например, $name ='"]' повредит выражение).

1
ответ дан 6 December 2019 в 15:32
поделиться

Хорошо, похож на XPath, был тем, что я хотел. Вот то, что я придумал, который делает то, что я хочу:

<?php

$xmlDocument = new DOMDocument();

$nameToFind = "Shiny Red";

if ($xmlDocument->load('file.xml')) {
        if (checkIfBuildingExists($xmlDocument, $nameToFind)) {
        echo "Found a red building!";
    }
}

function checkIfBuildingExists($xdoc, $name) {
    $result = false;
    $xpath = new DOMXPath($xdoc);
    $nodeList = $xpath->query('/targets/showcases/building', $xdoc);
    foreach ($nodeList as $node) {
        if ($node->getAttribute('name') == $name) {
            $result = true;
        }
    }
    return $result;
}

?>
3
ответ дан 6 December 2019 в 15:32
поделиться

Это выражение XPath:

       /*/*/building[@name = 'Shiny Red']

выбирает названный элемент building значение чей name атрибут является 'Солнечным Красным', и это - ребенок ребенка вершины.

Вероятно, в PHP существует способ оценить выражения XPath, затем просто оценить вышеупомянутое выражение XPath и использовать результат.

1
ответ дан 6 December 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: