带名称空间的XML(作为XMLNS)。获取特定的子节点

时间:2015-07-07 10:10:07

标签: php xml xpath simplexml

我从法律数据库中导出了大量的XML文件。 (以下是摘录):

<CodiceRegionale>
     <LeggeRegionale id="urn:nir:legge:2014-12-12;26" xmlns="http://www.normeinrete.it/nir/2.1/">
         <intestazione>Legge regionale 12 dicembre 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 un nuovo ...</corpo>
                      </el>
                      <el id="art41-com1-let_b">
                          <num>b) </num>
                          <corpo>coordinamento ... </corpo>
                      </el>
                 </comma>
             </articolo> 
         </articolato>
     </LeggeRegionale>
</CodiceRegionale>

由于XML使用名称空间,我可以按如下方式提取内容。例如,我可以像这样得到<articolo id=>的内容:

$xml->xpath('a:LeggeRegionale[@id="urn:nir:legge:2014-12-12;26"]/a:articolato/a:articolo[@id="art41"]');

<comma id=>的内容:

$xml->xpath('a:LeggeRegionale[@id="urn:nir:legge:2014-12-12;26"]/a:articolato/a:articolo[@id="art41"]/a:comma[@id="art41-com1"]');

实际上,我可以提取包含其他标记的所有标记,但我无法获取单个打开/关闭标记的内容,例如<num><rubrica>或{{1 }或<alinea>。我认为这可行,但事实并非如此:

<corpo>

2 个答案:

答案 0 :(得分:0)

试试这个

/CodiceRegionale//*[local-name()="el"] or

/CodiceRegionale//*[@id]//*[local-name()="el"] or


/CodiceRegionale//*[@id]//*[local-name()="articolo"]

相应地改变相对路径。

答案 1 :(得分:0)

我没有simplexml但是使用DOMDocument和XPath一起工作:

<?php
$xmlString = '...';
$document = new DOMDocument();
$document->loadXML($xmlString);
$xpath = new DOMXPath($document);
$xpath->registerNamespace('a', 'http://www.normeinrete.it/nir/2.1/');
$nodes = $xpath->query('a:LeggeRegionale[@id="urn:nir:legge:2014-12-12;26"]/a:articolato/a:articolo[@id="art41"]/a:comma[@id="art41-com1"]/a:alinea');
print_r($nodes->item(0));