ここから本文です

国会図書館の書誌データをxmlで取得しphpで処理しようとしています。

mya********さん

2014/7/2120:13:17

国会図書館の書誌データをxmlで取得しphpで処理しようとしています。

例えば、
http://iss.ndl.go.jp/api/opensearch?isbn=9784344001497
で取得できるxmlの一部に

<dc:subject>源氏物語</dc:subject>
<dc:subject xsi:type="dcndl:NDLC">KG59</dc:subject>
<dc:subject xsi:type="dcndl:NDC9">913.36</dc:subject>

がありますが、ここから、「913.36」を取り出したいのです。

$item->children("dc",true)->subject;
だと1つめの「源氏物語」が取り出されます。

$item->children("dc",true)->subject[2];
だと目的の「913.36」は取り出せるのですが、
別の書籍では<dc:subject>の個数が異なるため、
目的のデータがsubject[2]にあるとは限りません。

属性のxsi:type="dcndl:NDC9"を
どこかに仕込めばいいのではないかと思うのですが、
いろいろ試してもうまくいきません。

目的の要素を指定する方法をお教えください。
よろしくお願いいたします。

閲覧数:
382
回答数:
3

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tezcelloさん

2014/7/2200:05:02

コストが高いので避けられる傾向にあるようですが、xpath() は結構自由度が高いです。
以下で検証しました。

$src = <<<XML
(ご提示のURLから拾ってきたXMLソース)
XML;

$xml = simplexml_load_string($src);
$item = $xml->channel->item[0];
var_dump($item);
$ndc9 = $item->xpath('dc:subject[@xsi:type="dcndl:NDC9"]');
var_dump((string)$ndc9[0]);

// 結果は string '913.36' (length=6)



図書館と聞くと、条件反射で「Librahack 事件」を思い出します。
さすがに国会図書館で同じような事が起きるとは思えませんが、
諸事情が改善されている事を祈ります。

  • 質問者

    mya********さん

    2014/7/2204:53:07

    tezcelloさん、ありがとうございます。

    まさに求めていたものです。
    さっそく実装して動作を確認しました。
    ありがとうございました。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

IROHACODEさん

2014/7/2201:10:37

::::
$sxe = new SimpleXMLElement($xml);
$xsl =<<<XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" encoding="UTF-8">
<xsl:template match="/">
<xsl:apply-templates select="rss/channel/item" />
</xsl:template>

<xsl:template match="rss/channel/item">
<xsl:for-each select="dc:subject">
<xsl:if test="@xsi:type='dcndl:NDC9'">
<xsl:value-of select="." />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XSL;
$xslt = new XSLTProcessor;
$xslt->importStyleSheet(new SimpleXMLElement($xsl));
echo $xslt->transformToDoc($sxe)->textContent;
::::

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

mpywさん

2014/7/2120:34:54

「末尾を取り出す」という発想で

<?php

$url = 'http://iss.ndl.go.jp/api/opensearch?isbn=9784344001497';
$xml = new SimpleXMLElement($url, 0, true);
$subject = $xml->channel->item[0]->children('dc', true)->subject;
$number = end($subject);
var_dump($number);

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる