Get name of second level tag in XML string

77 Views Asked by At

I am trying to fetch data from an XML file and have converted it to JSON.

$xml = simplexml_load_file('types.xml','SimpleXMLElement',LIBXML_NOCDATA);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

The XML file contains data structured as:

<types>
    <type name="ACOGOptic">
        <nominal>15</nominal>
        <lifetime>14400</lifetime>
        <restock>1800</restock>
        <min>8</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="weapons"/>
        <usage name="Military"/>
    </type>
</types>

How can I simply fetch the value of type name="XX"?

In the above case, the desired result would be ACOGOptic.

2

There are 2 best solutions below

3
Olivier On BEST ANSWER

You can simply iterate over the type elements and check the value of the name attribute:

$xml = <<<XML
<types>
    <type name="ACOGOptic">
        <nominal>15</nominal>
        <lifetime>14400</lifetime>
        <restock>1800</restock>
        <min>8</min>
        <quantmin>-1</quantmin>
        <quantmax>-1</quantmax>
        <cost>100</cost>
        <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1" count_in_player="0" crafted="0" deloot="0"/>
        <category name="weapons"/>
        <usage name="Military"/>
    </type>
    <type name="Other">
        <nominal>20</nominal>
        <quantmin>0</quantmin>
        <quantmax>30</quantmax>
    </type>
</types>
XML;

$sx = simplexml_load_string($xml);
foreach($sx->type as $type)
{
    if($type['name'] == 'ACOGOptic')
        printf('Nominal: %s  Min: %s  Max: %s  Category: %s', $type->nominal, $type->quantmin, $type->quantmax, $type->category['name']);
}

Output:

Nominal: 15  Min: -1  Max: -1  category: weapons
0
mickmackusa On

As demonstrated at Using XPath to extract XML in PHP, (although not required in the asked question) xpath is a very direct tool to extract the unknown tag name without looped checks.

Code: (Demo)

$dom = new DOMDocument();
$dom->loadxml($xml);
$xpath = new DOMXPath($dom);
echo $xpath->evaluate('string(/types/type[@name]/@name)');
// ACOGOptic