Edit # 1 : Похоже, вы ссылаетесь на DOM в добавленном примере, а не на SimpleXML. Тем не менее, вот как вы это делаете с объектами SimpleXML, используя вашу структуру XML ...
$band = $_POST['band'];
if (property_exists($address, $band)) {
$lastvisits = $address->$band->lastvisit;
}
else {
/* handle the fact that the name of the element which the user passed is invalid */
}
Примечание: есть только 1 элемент lastvisit. Если их будет больше, вам нужно будет обернуть эти элементы lastvisit в один родительский элемент «lastvisit» в XML-файле. Допустимый XML и все такое.
Редактировать # 2 : есть некоторые проблемы с вашей структурой xml. «Битлз» слишком уникален, чтобы называться именем элемента. Вы можете изменить это так:
<addresses>
<address>
<ip>127.0.0.1</ip>
<visits>
<visit>
<band>Beatles</band>
<lastvisit>12/08/2006</lastvisit>
</visit>
<visit>
<band>New Kids On the Block</band>
<lastvisit>1/14/2008</lastvisit>
</visit>
</visits>
</address>
<address>
<ip>24.135.9.2</ip>
<visits>
...
</visits>
</address>
</addresses>
Затем вам нужно будет найти узел ip
со значением IP, который вы хотите найти, затем под узлом band
для значения "Beatles".
Редактирование # 3, 4: Добавление метода для DOM с использованием класса DOMXPath для запуска поиска по вышеуказанной структуре XML и добавление новой записи, если полоса не найдена ...
$band = $_POST['band'];
$client_IP = $_SERVER["REMOTE_ADDR"];
$doc = new DOMDocument();
$doc->load("votingxml/addresses.xml");
$xpath = new DOMXPath($doc);
$ip_query = $xpath->query('//addresses/address/ip[. = "' . $client_IP . '"]');
if ($ip_query->length === 1) {
// client's IP found, now grab and work with the client's address record
$address = $ip_query->item(0)->parentNode;
// search for the visit record within $address for band element value = $band
$band_query = $xpath->query('visits/visit/band[. = "'.$band.'"]', $address);
if ($band_query->length === 1) {
// $band found, now get visit parent record for more details
$visit = $band_query->item(0)->parentNode;
// with that, now do something with the record's lastvisit value
echo $visit->getElementsByTagName("lastvisit")->item(0)->nodeValue;
}
else {
// $band not found. Add new visit record to the XML file
// point to 'visits' group element
$visits = $address->getElementsByTagName("visits")->item(0);
// create a new 'visit' element, complete with 'band' and 'lastvisit' child elements
$visit = $doc->createElement("visit");
$band = $doc->createElement("band", $band);
$lastvisit = $doc->createElement("lastvisit", date("n/d/Y"));
$visit->appendChild($band);
$visit->appendChild($lastvisit);
// now add new 'visit' element to 'visits' element and save
$visits->appendChild($visit);
$doc->save("votingxml/addresses.xml");
}
}