2015-12-14 10 views
5

Sto tentando di utilizzare JDOM2 per estrarre le informazioni che mi interessano da un documento XML. Come posso ottenere un tag all'interno di un tag?JDOM2 xpath che trova nodi in uno spazio dei nomi diverso

Ho avuto solo parzialmente successo. Mentre sono stato in grado di usare xpath per estrarre i tag <record>, la query xpath per estrarre il titolo, la descrizione e altri dati con i tag record ha restituito null.

Ho utilizzato Xpath correttamente per estrarre i tag <record> dal documento. Per fare questo uso la query follpath xpath: "// oai: record" dove lo spazio dei nomi "oai" è uno spazio dei nomi che ho inventato per usare xpath.

È possibile visualizzare il documento XML che sto analisi qui, e ho messo un esempio riportato di seguito: http://memory.loc.gov/cgi-bin/oai2_0?verb=ListRecords&set=cwp&metadataPrefix=oai_dc

<record> 
    <header> 
     <identifier>oai:lcoa1.loc.gov:loc.pnp/cph.3a02293</identifier> 
     <datestamp>2009-05-27T07:22:37Z</datestamp> 
     <setSpec>cwp</setSpec> 
     <setSpec>lcphotos</setSpec> 
    </header> 
    <metadata> 
     <oai_dc:dc xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/       http://www.openarchives.org/OAI/2.0/oai_dc.xsd"> 
      <dc:title>Jubal A. Early</dc:title> 
      <dc:description>This record contains unverified, old data from caption card.</dc:description> 
      <dc:date>[between 1860 and 1880]</dc:date> 
      <dc:type>image</dc:type> 
      <dc:type>still image</dc:type> 
      <dc:identifier>http://hdl.loc.gov/loc.pnp/cph.3a02293</dc:identifier> 
      <dc:language>eng</dc:language> 
      <dc:rights>No known restrictions on publication.</dc:rights> 
     </oai_dc:dc> 
    </metadata> 
</record> 

Se si guarda nel documento più grande si vedrà che non c'è mai un "xmlns "attributo elencato su uno qualsiasi dei tag. C'è anche il problema che ci sono tre diversi namespace nel documento ("none/oai", "oai_dc", "dc").

Che cosa sta succedendo è che xpath non corrisponde a nulla e valutare Primo (padre) restituisce null.

Ecco alcuni dei miei codici per estrarre il titolo, la data, la descrizione ecc. Dall'elemento del record.

XPathFactory xpf = XPathFactory.instance(); 
    XPathExpression<Element> xpath = xpf.compile("//dc:title", 
        Filters.element(), null, 
        namespaceList.toArray(new Namespace[namespaceList.size()])); 
    Element tag = xpath.evaluateFirst(parent); 

    if(tag != null) 
    { 
     return Option.fromString(tag.getText()); 
    } 

    return Option.none(); 

Ogni pensiero sarebbe apprezzato! Grazie.

+0

c'è una domanda qui da qualche parte? non capisco cosa stai chiedendo? – jtahlborn

+0

Estraggo il contenuto di 'dc: title' da' record'? – Prichmp

+0

Non conosco jdom tho, ma partendo dal presupposto che hai mappato 'dc' nello spazio dei nomi corretto uri' http: // purl.org/dc/elements/1.1/', penso che XPath dovrebbe funzionare – har07

risposta

2

Nel prefisso XML, dc mappato allo spazio dei nomi uri http://purl.org/dc/elements/1.1/, quindi assicurarsi di aver dichiarato il mapping del prefisso dello spazio dei nomi da utilizzare in XPath di conseguenza. Questa è la parte dove il prefisso dello spazio dei nomi dichiarare in XML:

solo
<oai_dc:dc 
    xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ 
         http://www.openarchives.org/OAI/2.0/oai_dc.xsd"> 

XML parser vedere lo spazio dei nomi esplicitamente dichiarato nel XML, non si tenta di aprire l'URL namespace dal namespace non è necessariamente un URL . Ad esempio, il seguente URI che ho trovato in this recent SO question è accettabile anche per lo spazio dei nomi: uuid:ebfd9-45-48-a9eb-42d