这是从一系列意大利法律中导出的大量XML的摘录。我想将它转换为平面阵列。 (目标是提取并将部分XML转换为RTF文档,我发现使用正则表达式更容易操作它。)
$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;
要将其转换为平面数组,我正在使用Yoshi解决方案,这正是我所寻求的:
$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);
不幸的是,当内部标记为corpo
时,上述脚本无法获取标记rif
之间的值:
<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>
它确实 <rif>
标记内的值,但是它没有值 razionalizzazione e ... 和(Leggedibesabilità2011);
预期输出应为:
[#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);
由于我是XML的新手,请告诉我如何修复上述脚本。
答案 0 :(得分:0)
当您遇到//*[count(*) = 0]
元素(?)时,似乎想要对脚本捕获任何没有子元素(<corpo>
)的元素的规则进行例外处理。要做到这一点:
替换:
$xpath->query('//*[count(*) = 0]')
使用:
$xpath->query('//*[(count(*) = 0 or name() = "corpo") and name() != "rif"]')
这将获取任何<corpo>
元素的文本值,并忽略<rif>
元素。尽管通过硬编码corpo和rif处理逻辑,解决方案非常脆弱。
请注意,顺便说一句,我倾向于学习XPath来解析已经解析为适合regexp的XML的东西,作为一般方法。