This is an excerpt of a huge XML exported from a dB of italian laws. I would like to convert it to a flat array. (The goal is to extract and convert part of this XML into a RTF document and I find easier to manipulate it using regex).
$xml_string = <<<XML
<CodiceRegionale>
<sommario>
<elementoCapitolo>CAP a1</elementoCapitolo>
<elementoCapitoloDescr>
</elementoCapitoloDescr>
<elementoSommarioLegge>
<elementoTesto>1.1 Legge</elementoTesto>
</elementoSommarioLegge>
</sommario>
<LeggeRegionale id="urn:nir:2014-12-12;26" xmlns="http://www.normeinrete.it/nir/2.1/">
<elementoSommario xmlns="">
<elementoCapitolo>CAP a1</elementoCapitolo>
<elementoCapitoloDescr>
</elementoCapitoloDescr>
<elementoSettore />
<elementoSettoreDescr />
</elementoSommario>
<intestazione>Lex 12 2014, n. 26.</intestazione>
<articolato>
<articolo id="art41" xmlns="http://www.normeinrete.it/nir/2.1/">
<num>Art. 41</num>
<rubrica>(Riforma della finanza locale)</rubrica>
<comma id="art41-com1">
<num>1. </num>
<alinea>Al fine di supportare...</alinea>
<el id="art41-com1-let_a">
<num>a) </num>
<corpo>definizione di...</corpo>
</el>
<el id="art41-com1-let_b">
<num>b) </num>
<corpo>coordinamento della...</corpo>
</el>
<el id="art41-com1-let_c">
<num>c) </num>
<corpo>definizione delle...</corpo>
</el>
<el id="art41-com1-let_d">
<num>d) </num>
<corpo>la disciplina...</corpo>
</el>
</comma>
<comma id="art41-com2">
<num>2. </num>
<alinea>La revisione di...</alinea>
<el id="art41-com2-let_a">
<num>a) </num>
<corpo>
razionalizzazione e...
<rif xlink:href="urn:nir:stato:legge:2010-12-13;220#art1-com154" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink">articolo 1, comma 154, della legge 13 dicembre 2010, n. 220</rif>
(Legge di stabilità 2011);
</corpo>
</el>
<el id="art41-com2-let_b">
<num>b) </num>
<corpo>
applicazione dei...
<rif xlink:href="urn:nir:stato:costituzione:1947-12-27#art119" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink">articolo 119 della Costituzione</rif>
, nonché del principio...
</corpo>
</el>
<el id="art41-com2-let_c">
<num>c) </num>
<corpo>valorizzazione...</corpo>
</el>
<el id="art41-com2-let_d">
<num>d) </num>
<corpo>previsione di...</corpo>
</el>
<el id="art41-com2-let_e">
<num>e) </num>
<corpo>valorizzazione del...</corpo>
</el>
<el id="art41-com2-let_f">
<num>f) </num>
<corpo>previsione di...</corpo>
</el>
</comma>
<comma id="art41-com3">
<num>3. </num>
<corpo>La revisione normativa...</corpo>
</comma>
<comma id="art41-com4">
<num>4. </num>
<corpo>I disegni di...</corpo>
</comma>
</articolo>
<articolo id="art42" xmlns="http://www.normeinrete.it/nir/2.1/">
<num>Art. 42</num>
<rubrica>(Supporto finanziario regionale agli enti locali)</rubrica>
<comma id="art42-com1">
<num>1. </num>
<corpo>Il supporto...</corpo>
</comma>
<comma id="art42-com2">
<num>2. </num>
<corpo>Per le finalità di...</corpo>
</comma>
<comma id="art42-com3">
<num>3. </num>
<corpo>Gli incentivi regionali...</corpo>
</comma>
<comma id="art42-com4">
<num>4. </num>
<corpo>
In attuazione...
<rif xlink:href="urn:nir:stato:decreto.legislativo:1997-01-02;9#art9" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink">articolo 9 ...</rif>
(Norme di attuazione dello
<rif xlink:href="urn:nir:regione.friuli.venezia.giulia:statuto:" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink">statuto</rif>
speciale...
</corpo>
</comma>
<comma id="art42-com5">
<num>5. </num>
<corpo>Le modalità...</corpo>
</comma>
</articolo>
</articolato>
</LeggeRegionale>
<LeggeRegionale id="urn:nir:2015-05-22;12" xmlns="http://www.normeinrete.it/nir/2.1/">
<elementoSommario xmlns="">
<elementoCapitolo>CAP a7</elementoCapitolo>
<elementoCapitoloDescr>
</elementoCapitoloDescr>
<elementoSettore />
<elementoSettoreDescr />
</elementoSommario>
<intestazione>Lex 22 2015 n. 12...</intestazione>
<articolato>
<articolo id="art6">
<num>Art. 6</num>
<rubrica>(Regolamento interno del CAL)</rubrica>
<comma id="art6-com1">
<num>1. </num>
<corpo>Il CAL approva...</corpo>
</comma>
<comma id="art6-com2">
<num>2. </num>
<alinea>Il regolamento...</alinea>
<el id="art6-com2-let_a">
<num>a) </num>
<corpo>l'elezione...</corpo>
</el>
<el id="art6-com2-let_b">
<num>b) </num>
<corpo>le funzioni degli organi del CAL;</corpo>
</el>
<el id="art6-com2-let_c">
<num>c) </num>
<corpo>la costituzione...</corpo>
</el>
<el id="art6-com2-let_d">
<num>d) </num>
<corpo>la programmazione...</corpo>
</el>
<el id="art6-com2-let_e">
<num>e) </num>
<corpo>i casi nei...</corpo>
</el>
<el id="art6-com2-let_f">
<num>f) </num>
<corpo>le modalità di...</corpo>
</el>
</comma>
<comma id="art6-com3">
<num>3. </num>
<corpo>Il regolamento è pubblicato...</corpo>
</comma>
</articolo>
</articolato>
</LeggeRegionale>
<LeggeRegionale id="urn:nir:2014-12-12;26" xmlns="http://www.normeinrete.it/nir/2.1/">
<elementoSommario xmlns="">
<elementoCapitolo>CAP a8</elementoCapitolo>
<elementoCapitoloDescr>
</elementoCapitoloDescr>
<elementoSettore />
<elementoSettoreDescr />
</elementoSommario>
<intestazione>Lex 12 2014, n. 26....</intestazione>
<articolato>
<articolo id="art17">
<num>Art. 17</num>
<rubrica>(Piano dell'Unione)</rubrica>
<comma id="art17-com1">
<num>1. </num>
<corpo>Il Piano dell'Unione...</corpo>
</comma>
<comma id="art17-com2">
<num>2. </num>
<corpo>
Il Piano ...
<rif xlink:href="urn:nir:stato:decreto.legislativo:2000;267#art170" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink">articolo 170 ...</rif>
.
</corpo>
</comma>
<comma id="art17-com3">
<num>3. </num>
<corpo>Il Piano dell'Unione...</corpo>
</comma>
<comma id="art17-com4">
<num>4. </num>
<corpo>La relazione annuale...</corpo>
</comma>
</articolo>
</articolato>
</LeggeRegionale>
<LeggeRegionale id="urn:nir:regione.friuli.venezia.giulia:legge:2014-12-12;26" xmlns="http://www.normeinrete.it/nir/2.1/">
<elementoSommario xmlns="">
<elementoCapitolo>CAP a14</elementoCapitolo>
<elementoCapitoloDescr>
</elementoCapitoloDescr>
<elementoSettore />
<elementoSettoreDescr />
</elementoSommario>
<intestazione>Lex 12 dicembre 2014, n. 26 ....</intestazione>
<articolato>
<articolo id="art5">
<num>Art. 5</num>
<rubrica>(Unioni territoriali intercomunali)</rubrica>
<comma id="art5-com1">
<num>1. </num>
<corpo>Le Unioni territoriali...</corpo>
</comma>
<comma id="art5-com2">
<num>2. </num>
<corpo>
L'Unione ha...
<rif xlink:href="urn:nir:stato:decreto.legislativo:2000-08-18;267#art32" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink">articolo 32...</rif>
(Testo unico delle leggi sull'ordinamento degli enti locali).
</corpo>
</comma>
</articolo>
</articolato>
</LeggeRegionale>
</CodiceRegionale>
XML;
To convert it to a flat array, I'm using Yoshi solution which is what I was looking for:
$doc = new DOMDocument();
$doc->loadXML($xml_string);
$xpath = new DOMXPath($doc);
$result = array();
foreach ($xpath->query('//*[count(*) = 0]') as $node) {
$path = array();
$val = $node->nodeValue;
do {
if ($node->hasAttributes()) {
foreach ($node->attributes as $attribute) {
$path[] = sprintf('%s[%s]', $attribute->nodeName, $attribute->nodeValue);
}
}
$path[] = $node->nodeName;
}
while ($node = $node->parentNode);
$result[implode('/', array_reverse($path))] = $val;
}
print_r($result);
Unfortunately the above script doesn't get the values between the tag corpo
when there's a tag rif
inside:
<corpo>
razionalizzazione e...
<rif xlink:href="urn:nir:stato:legge:2010-12-13;220#art1-com154" xlink:type="simple" xmlns:xlink="http://www.w3.org/1999/xlink">articolo 1, comma 154, della legge 13 dicembre 2010, n. 220</rif>
(Legge di stabilità 2011);
</corpo>
It does get the value inside the <rif>
tag, but it does not get the values razionalizzazione e... and (Legge di stabilità 2011);
Expected output should be:
[#document/CodiceRegionale/LeggeRegionale/id[urn:nir:2014-12-12;26]/articolato/articolo/id[art41]/comma/id[art41-com2]/el/id[art41-com2-let_a]/corpo] => razionalizzazione e... articolo 1, comma 154, della legge 13 dicembre 2010, n. 220 (Legge di stabilità 2011);
As I'm really new to XML, kindly show me how to fix the above script.