XPath表达式失败。 (C中的libxml2)

时间:2012-09-25 12:15:57

标签: c++ c xpath libxml2

我在C程序中使用libxml2在XML文档中做一些事情。 现在......如果我查看以下XPath,我的结果是空的。

/scheda_conservatore[1]/patrimonio_archivistico[1]/lower_list[@type='risorsa_informativa']/risorsa_informativa_nested[@id='037006-001-2012-ri002']

但是...如果我查找以下XPAth,我有一个非空结果,其中包含的元素应该与第一个匹配。

/scheda_conservatore[1]/patrimonio_archivistico[1]/lower_list/risorsa_informativa_nested[@id='037006-001-2012-ri002']

现在......如果我一步一步地检查我的XPath,我......

/scheda_conservatore[1] -> Non empty node set
/scheda_conservatore[1]/patrimonio_archivistico[1] -> Non empty node set
/scheda_conservatore[1]/patrimonio_archivistico[1]/lower_list[@type='risorsa_informativa'] -> Empty Node set.

正如我之前所说,XML文档DO包含一个有效路径,但此请求不匹配。 更多:如果我请求具有XPath支持的jEdit或其他编辑器为我解决XPath表达式,结果是非空节点集。

我生气了。我看了很多次XPath表达,并且必须有一些非常错误,至少在我眼中是非常隐蔽的,即使它对其他人来说肯定会很棒。


更多... 以下,只是询问'type'属性而不查看它的值,给出一个有效的结果。但价值也是正确的。 / scheda_conservatore [1] / patrimonio_archivistico [1] / lower_list [@type] / risorsa_informativa_nested [@ ID = '037006-001-2012-ri002']


这是较大的XML文档的“导演剪辑”

  <?xml version="1.0" encoding="iso-8859-1"?>
  <scheda_conservatore    anno_rilevazione="2012" stato="non-storicizzata">  
     <!-- scheda 2012 per Bologna -->  
     <patrimonio_archivistico> 
        <lower_list type="complesso_archivistico"> 
           <complesso_archivistico_nested id="037006-001-2012-ca001" inventariazione="n"> 
              <lower_list type="altro_luogo_collocazione"> 
                 <altro_luogo_collocazione_nested id="037006-001-2012-alc001"> 
                    <!-- altro luogo 1 per bologna 2012 -->  
                    <upper_list type="complesso_archivistico"> 
                       <upper ref="ca002"/>  
                       <upper ref="ca003"/> 
                    </upper_list>  
                    <ubicazione>sotterraneo da botola segreta</ubicazione>  
                    <bridge_list type="sede"> 
                       <bridge ref="s001"/> 
                    </bridge_list>  
                 </altro_luogo_collocazione_nested>  
              </lower_list>  
              <!-- complesso 1 per bologna 2012 -->  
              <identificazione> 
                 <denominazione>Archivi dei Comprensori della provincia di Bologna</denominazione>  
                 <lista_altre_denominazioni> 
                    <!-- Modificato -->  
                    <altra_denominazione>Archivi dei Comprensori bolognesi</altra_denominazione>  
                    <altra_denominazione>Archivi dei Comprensori felsinei</altra_denominazione> 
                 </lista_altre_denominazioni>  
                 <livello>Complesso di fondi, Superfondo</livello> 
              </identificazione>  
              <dati_giuridici> 
                 <tipologia>Pubblico</tipologia>  
                 <notificato_dichiarato presente="y"> 
                    <data>20100304T000000</data> 
                 </notificato_dichiarato> 
              </dati_giuridici>  
              <lower_list type="titolare"> 
                 <titolare_nested id="037006-001-2012-t001"> 
                    <!-- titolare 1 per bologna 2012 -->  
                    <upper_list type="complesso_archivistico"> 
                       <upper ref="ca001"/>  
                       <upper ref="ca002"/> 
                    </upper_list>  
                 </titolare_nested> 
              </lower_list> 
           </complesso_archivistico_nested>  
        </lower_list>  
        <lower_list type="risorsa_informativa"> 
           <risorsa_informativa_nested id="037006-001-2012-ri001"> 
              <bridge_list type="complesso_archivistico"> 
                 <bridge ref="ca001"/>  
                 <bridge ref="ca002"/> 
              </bridge_list>  
              <!-- risorsa 1 per bologna 2012 -->  
              <descrizione> 
                 <autore>CSR - Centro studi e ricerche</autore>  
                 <titolo>Atti degli uffici: inventario-mappa topografica del...</titolo>  
                 <anno indicativo="y">1986</anno>  
                 <qualifica> 
                    <opz pubbl="y">Strumenti di ricerca archivistici</opz> 
                 </qualifica>  
                 <scelta_multipla nome="standard"> 
                    <opz valore="AACR2"/>  
                    <opz valore="Altro">EAD</opz> 
                 </scelta_multipla>  
                 <descr_estrinseca>Dattiloscritto (relativo a: documentazione post 1945 conservata in Viale Martiri della Libert&amp;#x2026;)</descr_estrinseca> 
              </descrizione>  
              <lista_pubblicazioni> 
                 <pubblicazione> 
                    <edita presente="y">stampa</edita>  
                    <edita_stampa> 
                       <curatore/>  
                       <edito_in/>  
                       <luogo/>  
                       <data/>  
                       <pagine/>  
                       <sbn/>  
                       <note/> 
                    </edita_stampa>  
                    <url/>  
                    <ultima_consultazione>20120611T165400</ultima_consultazione>  
                    <nota>Nessuna nota</nota> 
                 </pubblicazione>  
                 <pubblicazione> 
                    <edita presente="y">web</edita>  
                    <edita_stampa/>  
                    <url>www.risorsainformativa.gov</url>  
                    <ultima_consultazione/>  
                    <nota>Nessuna nota web</nota> 
                 </pubblicazione> 
              </lista_pubblicazioni>  
              <informatizzazione presente="y"> 
                 <scelta_multipla nome="applicativi_utilizzati"> 
                    <!-- MODIFICATO!! -->  
                    <opz valore="Access (database)"/>  
                    <opz valore="Altro">eXtraWay</opz> 
                 </scelta_multipla>  
                 <partecipazione_sistemi_informativi presente="y"> 
                    <descrizione>x.dams</descrizione> 
                 </partecipazione_sistemi_informativi> 
              </informatizzazione> 
           </risorsa_informativa_nested>  
        </lower_list>  
        <lower_list type="intervento"> 
           <intervento_nested autor_sovraintendenza="y" id="037006-001-2012-i001" in_corso="y"> 
              <!-- intervento 1 per bologna 2012 -->  
              <descrizione>Restauro archivi dei comprensori della provincia di Bologna</descrizione>  
              <scelta_multipla nome="tipologia"> 
                 <opz valore="Riordino"/>  
                 <opz valore="Altro">Pulizia</opz> 
              </scelta_multipla>  
              <avvio>20111101T000000</avvio>  
              <conclusione_prevista>20120701T000000</conclusione_prevista>  
              <conclusione_effettiva/>  
              <autore/>  
              <promotore/>  
              <scelta_multipla nome="standard_descrittivi"> 
                 <opz valore="ISAD"/>  
                 <opz valore="Altro">Descrizione altro standard descrittivo</opz> 
              </scelta_multipla>  
              <informatizzazione presente="y"> 
                 <scelta_multipla nome="applicativo_utilizzato"> 
                    <opz valore="Access (database)"/>  
                    <opz valore="Altro">eXtraWay</opz> 
                 </scelta_multipla>  
                 <partecipazione_sistemi_informativi presente="y"> 
                    <descrizione>x.dams</descrizione> 
                 </partecipazione_sistemi_informativi> 
              </informatizzazione>  
              <bridge_list type="complesso_archivistico"> 
                 <bridge ref="ca001"/> 
              </bridge_list> 
           </intervento_nested>  
        </lower_list>  
        <note/> 
     </patrimonio_archivistico>  
     <note/>
     <?xw-meta Dbms="ExtraWay" DbmsVer="24.3.1" OrgNam="3D Informatica" OrgVer="1.0" Classif="1.0" ManGest="3.1" ManTec="0.0.4" DocType="" InsUser="admin" InsTime="20120910175739" ModUser="rtirabassi" ModTime="20120925145347"?>
     <?xw-crc key32=e324f581-406521b5?>

  </scheda_conservatore>

好的,现在问题是假设另一个方面。可能我必须“关闭”这个并转移到另一个静止状态。

XPath,在原始(更广泛的)XML文档上是正确的,现在我看到问题出在哪里,但不知道如何解决它。

  • 如果我只将XPath表达式执行一次到XML文档,我就有了预期的结果;
  • 如果我在相同的XML文档上执行一个非常大的XPath序列,复杂的XPath(包含有关属性值的条件)将失败(那些只有那些);

所以我看看我们如何实现XPath评估,并发现XPathContext看到从未释放过。所以我更改了代码以便在每次XPath评估后释放上下文并每次创建一个新的但是......没有任何变化。

任何想法?

2 个答案:

答案 0 :(得分:1)

XPath正常运行。您正在寻找@id='037006-001-2012-ri002,其属性值为037006-001-2012-ri001。将xml更改为匹配的ri002后,libxml将返回正确的nodesetval。

如果它没有真正解决问题:可能以特殊方式处理id属性?尝试将其更改为idx。见Java XML DOM: how are id Attributes special?

答案 1 :(得分:0)

好的,找到问题。 对不起这个误报。 libxml2工作正常但在XPath评估周期中对XML文档进行了更改,这改变了使我相信XPath处理器失败的情况。 深度调试会话向我们展示了其他错误,只有XPath表达式在属性上有条件(但不是最后一个条件)失败。这促使我们找到了解决方案。 我的错。遗憾。