Jewelson Noronha
Jewelson Noronha

Reputation: 71

Selecting Attribute and listing Value base on NODE Value using Xpath

How do i get All Attribute Value ID of every node FLOWER?

<Files>
<data id="1"> 
   <Type>Flower</Type>
</data>
<data id="2">
   <Type>Flower</Type>
</data>
<data id="3">
   <Type>Flower</Type>
 </data>
<data id="4"> 
   <Type>Flower</Type>
 </data>
</Files>

In mysql case it will be like SELECT id from Files WHERE Type="Flower"

How do i code xpath for this condition?

and List it using SimpleXML within option box.

<select>
<?php
foreach ($type as $id) {
echo '<option value="'.$id.'">'.$id.'</option>';
} 
?>
</select>

Upvotes: 0

Views: 94

Answers (4)

Jewelson Noronha
Jewelson Noronha

Reputation: 71

This is how i used the answer Feel free to use the code if you like. Thanks!!

<?php
//I have used 2 given answer as example on how i used it. Feel Free to use the code below
$type = $_GET['type'];
if(file_exists("xml/data.xml")) {
$xml = simplexml_load_file('xml/data.xml') or die("Data Missing"); }
<!-- Code Example 1 -->
$ids = $xml->xpath('//data[(./Type/text()="'.$type.'")]/@id');
<!-- Code Example 2 -->
$idx = $xml->xpath('/Files/data[normalize-space(Type) = "'.$type.'"]/@id');
?>
<!-- Example 1 -->
<select>
  <?php
//echo $ids[0];
foreach ($ids as $id) {
echo '<option value="'.$id[0].'">'.$id[0].'</option>';
} 
?>
</select>
<!-- Example 2 -->
<select>
  <?php
//echo $ids[0];
foreach ($idx as $id2) {
echo '<option value="'.$id2[0].'">'.$id2[0].'</option>';
} 
?>
</select>
<a href="logout.php">Logout
</a>

Upvotes: 0

ThW
ThW

Reputation: 19512

Your XML is invalid, the closing root element does not match and the Type elements are closed as type. XML is case sensitive.

Xpath works uses location paths and conditions a location path is a hierarchical path to the element from the current context. They return a list of nodes. The list can be filtered using conditions.

SimpleXMLElement objects have a method xpath() to execute an expression in the context of the associated node.

$xml = <<<'XML'
<Files>
<data id="1"> 
   <type>Flower</type>
</data>
<data id="2">
   <type>Flower</type>
</data>
<data id="3">
   <type>Flower</type>
 </data>
<data id="4"> 
   <type>Flower</type>
 </data>
</Files>
XML;

$files = new SimpleXMLElement($xml);

$target = new SimpleXMLElement('<select/>');
foreach ($files->xpath('data[type = "Flower"]') as $data) {
echo '.';
  $option = $target->addChild('option', $data['id']);
  $option['value'] = $data['id'];
}
echo $target->asXml();

You should not create you XML as text. Use an XML Api for it.

DOM is more specific and powerful. For example you can serialize the created DOM as HTML.

$source = new DOMDocument();
$source->loadXml($xml);
$xpath = new DOMXpath($source);
$target = new DOMDocument();
$select = $target->appendChild($target->createElement('select'));

foreach ($xpath->evaluate('/Files/data[type = "Flower"]') as $data) {
  $option = $select->appendChild($target->createElement('option'));
  $option->setAttribute('value', $data->getAttribute('id'));
  $option->appendChild($target->createTextNode($data->getAttribute('id')));
}
echo $target->saveHtml($select);

Upvotes: 1

zx485
zx485

Reputation: 29052

To get all @id attribute's values try

/Files/data[normalize-space(Type) = 'Flower']/@id

Upvotes: 1

eLRuLL
eLRuLL

Reputation: 18799

'//data[(./Type/text()="Flower")]/@id'

Upvotes: 1

Related Questions