2015-12-14 14 views
5

Próbuję użyć JDOM2, aby wyodrębnić informacje, na których mi zależy, z dokumentu XML. Jak uzyskać tag w tagu?JDOM2 xpath znajdowanie węzłów w innej przestrzeni nazw

Udało mi się tylko częściowo. Chociaż udało mi się użyć xpath do wyodrębnienia tagów <record>, zapytanie xpath, aby wyodrębnić tytuł, opis i inne dane w tagach rekordu, zwróciło wartość null.

Używam Xpath pomyślnie, aby wyodrębnić znaczniki <record> z dokumentu. Aby to zrobić, używam następującego zapytania xpath: "// oai: record" gdzie przestrzeń nazw "oai" jest przestrzenią nazw, którą przygotowałem w celu użycia xpath.

można zobaczyć dokument XML parsowania jestem tutaj, a ja umieścić próbka poniżej: 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> 

Jeśli spojrzeć w szerszym dokumencie widać, że nigdy nie jest „xmlns "atrybut wymieniony na którymś z tagów. Istnieje również kwestia istnienia trzech różnych przestrzeni nazw w dokumencie ("none/oai", "oai_dc", "dc").

To, co się dzieje, to że xpath nic nie pasuje, a evaluateFirst (parent) zwraca zero.

Oto niektóre z mojego kodu, aby wyodrębnić tytuł, datę, opis itp. Z elementu rekordu.

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(); 

Wszelkie uwagi będą mile widziane! Dzięki.

+0

Czy jest tu gdzieś pytanie? nie rozumiem, o co pytasz? – jtahlborn

+0

Czy mogę wyodrębnić zawartość 'dc: title' z' record'? – Prichmp

+0

Nie wiem o jdom tho, ale zakładając, że mapowałeś 'dc' na poprawną przestrzeń nazw uri' http: // purl.org/dc/elements/1.1/', myślę, że XPath powinien działać – har07

Odpowiedz

2

W swoim prefiksie XML, dc zmapowany do przestrzeni nazw uri http://purl.org/dc/elements/1.1/, więc upewnij się, że zadeklarowałeś mapowanie prefiksu przestrzeni nazw, które będzie odpowiednio używane w XPath. To jest część, gdzie przedrostek nazw zadeklarować w XML:

tylko
<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 zobaczyć nazw jawnie zadeklarowane w XML, nie będzie próbował otworzyć URL namespace od nazw niekoniecznie jest URL . Na przykład następujący identyfikator URI, który znalazłem pod numerem this recent SO question, jest również dopuszczalny dla przestrzeni nazw: uuid:ebfd9-45-48-a9eb-42d

Powiązane problemy