2015-12-14 7 views
5

私はXML文書から気になる情報を抽出するためにJDOM2を使用しようとしています。タグ内でタグを取得するにはどうすればよいですか?JDOM2 xpath異なる名前空間内のノードを見つける

私は部分的にしか成功しませんでした。私は<record>タグを抽出するためにxpathを使用することができましたが、レコードタグにタイトル、説明、その他のデータを抽出するxpathクエリはnullを返しています。

Xpathを使用して、文書から<record>タグを抽出しました。これを行うには、次のxpathクエリを使用します。 "oai:record"ここで、 "oai"名前空間はxpathを使用するために作成した名前空間です。あなたが大規模文書を見ると、あなたが「のxmlnsは決してありませんことがわかります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> 

あなたは私がここで解析していたXML文書を見ることができる、と私は下のサンプルを入れています"属性は、いずれかのタグにリストされています。ドキュメントには3つの異なる名前空間が存在するという問題もあります( "none/oai"、 "oai_dc"、 "dc")。

何が起こっているかは、xpathが何も一致しておらず、evaluateFirst(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についてはわかりませんが、適切な名前空間uri 'http://purl.org/dc/ elements/1.1 /'に 'dc'をマップしたと仮定すると、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パーサだけ名前空間は必ずしもURLではないので、明示的にXMLで宣言された名前空間は、それが名前空間URLを開こうとしないだろう見ます。たとえば、this recent SO questionで見つかった以下のURIもネームスペースとして使用できます。uuid:ebfd9-45-48-a9eb-42d

関連する問題