/ / iterating cez neznámu štruktúru XML s PHP (DOM) - php, xml, array, parsovanie, slučky

Iterovanie cez neznámu štruktúru XML pomocou PHP (DOM) - php, xml, array, parsing, slučky

Chcem napísať funkciu, ktorá analyzuje (teoreticky) neznámu štruktúru údajov XML do ekvivalentného PHP poľa.

Tu je môj vzor XML:

<?xml version="1.0" encoding="utf-8"?>
<content>

<title>Sample Text</title>

<introduction>
<paragraph>This is some rudimentary text</paragraph>
</introduction>
<description>
<paragraph>Here is some more text</paragraph>
<paragraph>Even MORE text</paragraph>
<sub_section>
<sub_para>This is a smaller, sub paragraph</sub_para>
<sub_para>This is another smaller, sub paragraph</sub_para>
</sub_section>
</description>
</content>

Modifikoval som túto funkciu DOM iterating od devarticles:

$data = "path/to/xmldoc.xml";
$xmlDoc = new DOMDocument(); #create a DOM element
$xmlDoc->load( $data ); #load data into the element
$xmlRoot = $xmlDoc->firstChild; #establish root

function xml2array($node)
{
if ($node->hasChildNodes())
{
$subNodes = $node->childNodes;
foreach ($subNodes as $subNode)
{
#filter node types
if (($subNode->nodeType != 3) || (($subNode->nodeType == 3)))
{
$arraydata[$subNode->nodeName]=$subNode->nodeValue;
}
xml2array($subNode);
}
}
return $arraydata;
}
//The getNodesInfo function call

$xmlarray = xml2array($xmlRoot);


// print the output - with a little bit of formatting for ease of use...
foreach($xmlarray as $xkey)
{
echo"$xkey<br/><br/>";
}

Teraz kvôli spôsobu, akým prechádzajú prvkydo poľa, ktoré prepisujem akékoľvek prvky, ktoré zdieľajú názov uzla (pretože v ideálnom prípade chcem dať kľúče rovnaké názvy ako ich pôvodné uzly) Moja rekurzia nie je skvelá ... Avšak aj keby som vyprázdnil zátvorky - druhá vrstva uzlov stále prichádza ako hodnoty na prvej vrstve (pozri text popisovacieho uzla).

Každý, kto má nejaké nápady, ako to môžem lepšie postaviť?

odpovede:

0 pre odpoveď č. 1

Možno budete tiež chcieť pozrieť XML Unserializer

http://pear.php.net/package/XML_Serializer/redirected


2 pre odpoveď č. 2

Možno by ste mali byť lepšie, keby ste niekoho zablokovali

http://www.bin-co.com/php/scripts/xml2array/

    /**
* xml2array() will convert the given XML text to an array in the XML structure.
* Link: http://www.bin-co.com/php/scripts/xml2array/
* Arguments : $contents - The XML text
*                $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value.
*                $priority - Can be "tag" or "attribute". This will change the way the resulting array sturcture. For "tag", the tags are given more importance.
* Return: The parsed XML in an array form. Use print_r() to see the resulting array structure.
* Examples: $array =  xml2array(file_get_contents("feed.xml"));
*              $array =  xml2array(file_get_contents("feed.xml", 1, "attribute"));
*/
function xml2array($contents, $get_attributes=1, $priority = "tag") {

1 pre odpoveď č. 3

Možno vás bude zaujímať SimpleXML alebo xml_parse_into_struct.

$ arraydata nie je prenesená na ďalšie hovory na xml2array () ani nie je použitá návratová hodnota, takže áno "Moja rekurzia nie je skvelá ..." je pravda ;-)
Ak chcete pridať nový prvok do existujúceho poľa môžete použiť prázdne hranaté zátvorky, $ arr [] = 123; $ Arr [$ x] [] = 123;