将XML转换为平面数组。 工作但只是一点点XPath提示

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.

It seems like you want to make an exception to your script's rule of capturing any element without child elements (//*[count(*) = 0]) when you encounter <corpo> elements(?). To do that:

Replace:

$xpath->query('//*[count(*) = 0]')

With:

$xpath->query('//*[(count(*) = 0 or name() = "corpo") and name() != "rif"]')

This will take the text value of any <corpo> elements and ignore <rif> elements. Although the solution is quite brittle by hard coding corpo and rif handling logic.

Note, as an aside, I would favor learning XPath to parse something that is already XML over parsing to something suitable for regexp, as a general approach.