我在 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] -> 非空节点集 /scheda_conservatore[1]/patrimonio_archivistico[1] -> 非空节点集 /scheda_conservatore[1]/patrimonio_archivistico[1]/lower_list[@type='risorsa_informativa'] -> 空节点集。
正如我之前所说,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&#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 文档上是正确的,现在我知道问题出在哪里,但不知道如何解决它。
- 如果我只在 XML 文档上执行一次 XPath 表达式,我就有了预期的结果;
- 如果我在同一个 XML 文档上执行相当大的 XPath 序列,复杂的 XPath(包含有关属性值的条件)会失败(那些并且只有那些);
所以我看了一下我们是如何实现 XPath 评估的,发现 XPathContext 从来没有被释放。所以我更改了代码,以便在每次 XPath 评估后释放上下文并每次都创建一个新的,但是......没有任何变化。
任何想法?