2015-12-14 2 views
5

Я пытаюсь использовать JDOM2 для извлечения информации, о которой я беспокоюсь из XML-документа. Как получить тег в теге?JDOM2 xpath для нахождения узлов в другом пространстве имен

Я был только частично успешным. Хотя мне удалось использовать xpath для извлечения тегов <record>, запрос xpath для извлечения заголовка, описания и других данных в тегах записей возвращал значение null.

Я успешно использовал Xpath для извлечения <record> тегов из документа. Для этого я использую следующий запрос xpath: «// oai: record», где пространство имен «oai» - это пространство имен, которое я создал, чтобы использовать xpath.

Вы можете увидеть документ XML я разбор здесь, и я поместил образец ниже: 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> 

Если смотреть в более широком документе вы увидите, что там никогда не бывает «XMLNS атрибут, указанный в любом из тегов. Также существует вопрос о наличии в документе трех разных пространств имен («none/oai», «oai_dc», «dc»).

Что происходит, так это то, что xpath ничего не соответствует, а метод вычисленияFirst (parent) возвращает значение null.

Вот некоторые из моего кода, чтобы извлечь название, дату, описание и т. Д. Из элемента записи.

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

Любые мысли будут оценены! Благодарю.

+0

есть ли здесь вопрос? Я не понимаю, о чем вы спрашиваете? – jtahlborn

+0

Я извлекаю содержимое 'dc: title' из' record'? – Prichmp

+0

Я не знаю о jdom tho, но при условии, что вы сопоставили 'dc' с правильным пространством имен uri' http: // purl.org/dc/elements/1.1/', я думаю, что XPath должен работать – har07

ответ

2

В вашем XML префикс dc сопоставлен с пространством имен uri http://purl.org/dc/elements/1.1/, поэтому убедитесь, что вы указали сопоставление префикса пространства имен, которое будет использоваться в XPath соответственно. Это часть, где префикс пространства имен объявить в вашем XML:

только
<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 парсер см пространства имен явно объявлен в XML, он не будет пытаться открыть URL пространства имен, так как пространства имен не обязательно является URL , Например, следующий URI, который я нашел в this recent SO question, также подходит для пространства имен: uuid:ebfd9-45-48-a9eb-42d

Смежные вопросы