Reputation: 17
I'm trying to read the XML using DOM
parser. My XML
is dynamic so I cannot say always all values / tags will present in the XML
. In this case i need to check the tag whether it is exists or not before reading it.
I tried like this as well
if($val->getElementsByTagName("cityName") != null) {
}
if(!empty($val->getElementsByTagName("cityName"))) {
}
getting error : Fatal error: Call to a member function getElementsByTagName() on a non-object in F:\xampp\htdocs\test\static-data.php on line 160
Any solution to find the tag existence. As like has Attribute as we check weather Attribute is there or not.
Upvotes: 0
Views: 242
Reputation: 19512
If you use Xpath to fetch the nodes, you can avoid the validation.
Load some XML and create an DOMXpath instance for it.
$xml = <<<XML
<phoneNumbers>
<phoneNumber type="home">212 555-1234</phoneNumber>
<phoneNumber type="fax">646 555-4567</phoneNumber>
</phoneNumbers>
XML;
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXpath($dom);
Get the "home" phone number:
var_dump(
$xpath->evaluate('string(/phoneNumbers/phoneNumber[@type="home"])')
);
Output:
string(12) "212 555-1234"
No "mobile" number exists, so the result is an empty string
var_dump(
$xpath->evaluate('string(/phoneNumbers/phoneNumber[@type="mobile"])')
);
Output:
string(0) ""
You can count the numbers:
var_dump(
[
'all' => $xpath->evaluate('count(/phoneNumbers/phoneNumber)'),
'home' => $xpath->evaluate('count(/phoneNumbers/phoneNumber[@type="home"])'),
'fax' => $xpath->evaluate('count(/phoneNumbers/phoneNumber[@type="fax"])'),
'mobile' => $xpath->evaluate('count(/phoneNumbers/phoneNumber[@type="mobile"])')
]
);
Output:
array(4) {
["all"]=>
float(2)
["home"]=>
float(1)
["fax"]=>
float(1)
["mobile"]=>
float(0)
}
Or iterate the numbers
foreach ($xpath->evaluate('/phoneNumbers/phoneNumber') as $phoneNumber) {
var_dump(
$phoneNumber->getAttribute('type'),
$phoneNumber->nodeValue
);
}
Output:
string(4) "home"
string(12) "212 555-1234"
string(3) "fax"
string(12) "646 555-4567"
Full example: https://eval.in/123212
Upvotes: 1