0

我在 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&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 文档上是正确的,现在我知道问题出在哪里,但不知道如何解决它。

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

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

任何想法?

4

2 回答 2

1

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

如果它不能真正解决问题:也许id属性以特殊方式处理?尝试将其更改为idx. 请参阅Java XML DOM:id 属性有何特别之处?

于 2012-09-25T13:43:17.710 回答
0

好的,找到问题。很抱歉这个误报。libxml2 可以正常工作,但在 XPath 评估周期期间,XML 文档发生了变化,这改变了场景,导致我相信 XPath 处理器出现故障。深度调试会话向我们展示了其他问题,只有具有属性条件(但不是最后一个条件)的 XPath 表达式失败。这促使我们找到了解决方案。我的错。对不起。

于 2012-09-26T13:26:30.880 回答