私は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は...
/schedule_conservatore[1]->空でないノードセット / schedule_conservatore [1] /patrimonio_archivistico[1]->空でないノードセット / scheda_conservatore [1] / patrimonio_archivistico [1] / lower_list [@ type='risorsa_informativa']->空のノードセット。
前に述べたように、XMLドキュメントには有効なパスが含まれていますが、これはこの要求と一致しません。詳細:jEditまたはXPathをサポートする他のエディターに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&#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ドキュメントに対して1回だけ実行すると、期待どおりの結果が得られます。
- 同じXMLドキュメントに対してかなり大きなシーケンスのXPathを実行すると、複雑なXPath(属性値に関する条件を含む)が失敗します(それらとそれらのみ)。
そこで、XPath評価をどのように実装したかを調べたところ、XPathContextが解放されなかったことがわかりました。そのため、各XPath評価後にコンテキストを解放し、毎回新しいコンテキストを作成するためにコードを変更しましたが、何も変更されていません。
何か案が?