0

I am using PHP DOM XPath to read XML. XML is having following structure where I got stuck

<details>
    <name>name1</name>
    <address>address1</address>
</details>
<details>
    <name>name2</name>
    <mobile>mobileNum</mobile>
    <address>address2</address>
</details>

I have array like

  array(
        'name',
        'mobile',
        'address'
    ); 

I use this array and read values from XML and store that values in other array but in the first record mobile number is not present so it read mobile no from second record and inserts it in first record.

Expected output is

array
(

    [0] => array(

                'person_name' = name1,
                'address' = address1
                )
    [1] => array(

                'person_name' = name1,
                'mobile_no' = mobileNum
                'address' = address1
                )
)

But I get output as

array
(

    [0] => array(

                'person_name' = name1,
                'mobile_no' = mobileNum
                'address' = address1
                )
    [1] => array(

                'person_name' = name1,
                'address' = address1
                )
)

How can I differentiate values between two nodes with same name.

Code to read XML is

$nodes = array
(
    'person_name' => 'name',
    'mobile_no'   => 'mobile',
    'address'     => 'address'
)

$final_data = array();

$node_values = '';

foreach($nodes as $key => $data)
{   
    $node_values = $xml->xpath('//details'.$data); 

    $node_values = json_decode(json_encode((array)$node_values), TRUE);

    if(!empty($node_values))    
    {   
        $i = 0;

        foreach($node_values as $d)
        {
            $final_data[$i][$key] = trim($d[0]);

            $i++;
        }
    }
}
8
  • 1
    Show us your code please. Commented Mar 10, 2017 at 6:37
  • 1
    Such approach is wrong, Iterate over details Commented Mar 10, 2017 at 6:53
  • then what can be other way so I can get data correctly.Is there any other possibility to read Commented Mar 10, 2017 at 6:56
  • I said - iterate over details nodes. Commented Mar 10, 2017 at 6:58
  • means like $xml->xpath('//details/*) Commented Mar 10, 2017 at 7:01

1 Answer 1

1

Here's a working example with comments explaining how it works:

https://3v4l.org/ICO5i

<?php

// First of all, I've added <root> element to your XML document,
// because otherwise it's invalid. 
// But it's not important for the rest of the code.
//
// Also I've added additional <somethingelse> tag to show that filtering is working
$xmlString = '<root><details>
    <name>name1</name>
    <address>address1</address>
</details>
<details>
    <name>name2</name>
    <mobile>mobileNum</mobile>
    <address>address2</address>
    <somethingelse>This will be filtered</somethingelse>
</details></root>';


$xml = new SimpleXMLElement($xmlString);
//array_flip to get node names as keys for later foreach loop
$nodes = array_flip(array
(
    'person_name' => 'name',
    'mobile_no'   => 'mobile',
    'address'     => 'address',
));

$final_data = array();

//Here are all <details> sections' data in array.
$node_values = $xml->xpath('//details'); 
$node_values = json_decode(json_encode((array)$node_values), TRUE);

//this loop filters XML data from keys not existing in $nodes,
// which are the only that you want to keep
foreach($node_values as $node) {
    $final_data[] = array_intersect_key($node, $nodes);
}

var_dump($final_data);

I assumed, that you want to filter XML data that it's not listed in $nodes array. Otherwise, if you don't mind having more data than you need, you could just skip the foreach loop and use $node_values as your final data.

Sign up to request clarification or add additional context in comments.

1 Comment

Jakub Matczak: Thanks. It works fine but if there is prefix then it gives blank output.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.