2012-09-25 86 views
0

我在C程序中使用libxml2在XML文檔中執行某些操作。 現在...如果我看下面的XPath,我得到一個空的結果。XPath表達式失敗。 (C中的libxml2)

 
/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文檔確實包含一個有效的路徑,但這不是與此請求相匹配。 更多:如果我要求jEdit或其他具有XPath支持的編輯器爲我解決XPath表達式,那麼結果是一個非空節點集。

我要生氣了。我觀察了XPath表達式數千次,並且至少對我來說非常隱蔽,即使它對別人來說肯定會很棒。


更多... 下,只是要求在「類型」屬性不看它的價值,給予有效的結果。但價值也是正確的。 /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> 

好了,現在的問題是假設另一個方面。可能我必須「關閉」這個並轉到另一個靜止狀態。

對於原始(更寬)的XML文檔,XPath是正確的,現在我看到問題出在哪裏,但不知道如何解決它。

  • 如果我只執行一次XPath表達式到XML文檔上,我有預期的結果;
  • 如果我在同一個XML文檔上執行一個非常大的XPath序列,則複雜的XPath(包含有關屬性值的條件)將失敗(那些和只有那些);

因此,我看看我們如何實現XPath評估,並發現XPathContext從未釋放過。因此,爲了在每次XPath評估之後釋放上下文並每次創建一個新的代碼,但是沒有任何更改,我更改了代碼。

任何想法?

+0

是的,正如我所說的那樣,使用XPath解析器(jEdit和適當的PlugIn)處理的同一個XML文檔給出了一個有效的結果,這意味着,第一個XPath表達式在C++程序中給我沒有有效結果,在其他情況下有效(PHP,Java ...) –

+0

您可以發佈您匹配的完整'lower_list'標籤XML(包括屬性和內容)嗎? – Lucero

+0

文檔中是否存在命名空間? – Joe

回答

1

XPath正常工作。您正在尋找@id='037006-001-2012-ri002,屬性值爲037006-001-2012-ri001。將xml更改爲ri002後,libxml返回正確的節點集。

如果它不能真正解決問題:也許id屬性被以特殊方式處理?嘗試將其更改爲idx。見Java XML DOM: how are id Attributes special?

+0

確認同樣的事情,例如XML有ri001和xpaths指定ri002。將xpaths更改爲ri002具有在問題返回結果中提及的所有表達式。 –

+0

我的錯:原始XML文件超過150KB,我無法將其添加到原始郵件(最大字符數爲30000)。 在剪切和過去期間,我刪除了與我之前做過的樣本匹配的元素。 我會嘗試以不同的方式切割它。 注意:我已經知道XPath il是正確的(根據XML的內容),我只是說,正如Michale Key所做的那樣,libxml2(包括Win和Linux)的C實現未能解決此XPath問題,而相同,在Java中,在PHP和其他,正常工作。 –

+0

門,所以你建議它在一個大文件上失敗並傳遞一個小文件?因爲我們在(你的)小檔案上試過了。因此,請嘗試劃分您的150KB,直到找到一個最小的違規示例向libxml提交錯誤報告。您的應用程序是否在您發佈的小示例上失敗?所以我寧願在你的應用程序中搜索一個bug。當我在家的時候,我會在你的(更正的ri001-> ri002)文件中附上一個小小的c prog,用你的xpath表達式成功。 – Jarekczek

0

好的,找到問題。 對不起這個虛驚一場。 libxml2可以正常工作,但在XPath評估週期中,XML文檔發生了更改,這些更改導致我相信XPath處理器失敗。 深度調試會話向我們展示了另外一件事情是錯誤的,只有他的XPath表達式具有屬性條件(但不是最後一個條件)失敗。這促使我們找到解決方案。 我的錯。抱歉。

+0

好吧,我標記了關閉/刪除的問題,因爲標題問題不適用。無論如何,我想我們幫助了你,也許你可以接受答案「XPath正常工作」。 – Jarekczek

+0

我認爲我必須接受一個有效的答案,因爲錯誤全是我的(我的同事),XPath正常工作。 –

+0

別擔心:)我很高興你解決了這個問題,並且你向我們解釋了一切。謝謝! – Jarekczek