PHP: XML düğümü niteliği ile varsa kontrol edin

4 Cevap php

Ben bunu anlamaya görünüyor olamaz. Ben şu XML dosyası vardır:

<?xml version="1.0" encoding="UTF-8"?>
<targets>
  <showcases>
    <building name="Big Blue" />
    <building name="Shiny Red" />
    <building name="Mellow Yellow" />
  </showcases>
</targets>

Ben bir <building> düğüm verilen ad ile var olup olmadığını test etmek gerekiyor. Google'da bulmak gibi görünüyor her şey aşağıdaki gibi bir şey yapmak bana söyler:

$xdoc->getElementsByTagName('building')->item(0)->getAttributeNode('name')

... Ama doğru, bu sadece ilk <building> düğümü test etmek olmadığını anlamak? item(0)? Bunun için XQuery kullanmanız gerekir mi?

Biraz yardım takdir ediyorum! Teşekkürler!

4 Cevap

Ben (PHP ext / SimpleXML ve XPath kullanarak) şu öneririm:

$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);
}

XPath ne istediğini gibiydi, tamam görünüyor. İşte ben bunu istiyorum ne yapar ile geldi ne:

<?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;
}

?>

This XPath expression:

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

Kimin name nitelik 'Parlak Kırmızı' olduğunu ve üst elemanın bir çocuğun bir çocuk değildir building değeri adlandırılmış öğeyi seçer.

Probably in PHP there is a way to evaluate XPath expressions, then just evaluate the above XPath expression and use the result.

Ben doğru olduğunu anlamak, bu sadece ilk düğümü test etmez?

Evet. Bu gibi DOM yöntemlerini kullanmak istiyorsanız Yani, bir döngü içinde bunu yapmak zorunda olacak. örn.:

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

XPath ile (örn. $ isim = '"]' ifadesini kıracak) Dimitre ve sgehrig tarafından yayınlanmıştır olarak, döngü ortadan kaldırabilir, ama sen XPath ifadesi enjekte edilmesine izin ne karakterler konusunda dikkatli olmak lazım .