2015-12-14 17 views
5

Ben bir XML belgesinden önemli olan bilgileri ayıklamak için JDOM2'yi kullanmaya çalışıyorum. Bir etiket içinde nasıl etiket alabilirim?JDOM2 xpath farklı bir ad alanı içinde düğümleri bulma

Sadece kısmen başarılı oldum. <record> etiketlerini ayıklamak için xpath kullanabildiğim halde, kayıt etiketlerindeki başlığı, açıklamayı ve diğer verileri ayıklamak için xpath sorgusu sıfırlandı.

Xpath'i belgeden çıkarıp <record> etiketlerini ayıklamak için kullanıyorum. Bunu yapmak için follwing xpath sorgusunu kullanıyorum: "// oai: record", "oai" ad alanının xpath kullanabilmek için oluşturduğum bir ad alanı.

Sen burada ayrıştırma XML belgesini görebilir ve bir örnek aşağıda koyduk: Daha büyük belgede bakarsak 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> 

bir "xmlns orada hiç olduğunu göreceksiniz "etiketlerden herhangi birinde listelenen özellik. Belgedeki üç farklı isim alanının olması da söz konusudur ("none/oai", "oai_dc", "dc").

Oluyor olan, xpath öğesinin hiçbiriyle eşleşmediği ve evalFirst (parent) öğesi null döndürüyor olmasıdır.

Kayıt kodunun başlığını, tarihini, açıklamasını vb. Ayıklamak için kodumdan bazılarını burada bulabilirsiniz.

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

Herhangi bir düşünce takdir edilecektir! Teşekkürler.

+0

Burada bir yerde bir soru var mı? ne sorduğunu anlamıyorum – jtahlborn

+0

"dc: title" öğesinin içeriğini "record" dan çıkarırım? – Prichmp

+0

Ben jdom tho hakkında bilmiyorum, ama doğru ad alanına dc dc: http: // purl.org/dc/elements/1.1/'eşlediğini varsayarak, XPath – har07

cevap

2

XML'inizde, uri http://purl.org/dc/elements/1.1/ ad alanına eşlenen dc öneki, bu nedenle, XPath'da kullanılacak ad alanı önek eşlemesini bildirdiğinizden emin olun. Bu ad öneki XML beyan parçasıdır:

<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 ayrıştırıcı sadece ad mutlaka bir URL olmadığından açıkça XML ilan ad, bu ad URL'yi açmaya olmaz bakınız . Örneğin, this recent SO question numaralı belgede bulduğum aşağıdaki URI, ad alanı için de kabul edilebilir: uuid:ebfd9-45-48-a9eb-42d