isbndb 1.5.5 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +19 -0
- data/.rspec +1 -0
- data/.rvmrc +48 -0
- data/.travis.yml +6 -0
- data/Gemfile +2 -14
- data/Gemfile.lock +41 -21
- data/README.markdown +118 -102
- data/Rakefile +6 -46
- data/config/isbndb.example.yml +3 -0
- data/isbndb.gemspec +19 -73
- data/lib/core_extensions/nil.rb +5 -0
- data/lib/core_extensions/string.rb +49 -0
- data/lib/isbndb.rb +9 -113
- data/lib/isbndb/access_key_set.rb +31 -20
- data/lib/isbndb/exceptions.rb +1 -2
- data/lib/isbndb/query.rb +78 -0
- data/lib/isbndb/result.rb +38 -39
- data/lib/isbndb/result_set.rb +32 -33
- data/spec/responses/access_key_error.xml +5 -0
- data/spec/responses/authors_seth.xml +46 -0
- data/spec/responses/books_hello.xml +76 -0
- data/spec/responses/categories_fiction.xml +46 -0
- data/spec/responses/keystats.xml +6 -0
- data/spec/responses/publishers_francis.xml +46 -0
- data/spec/responses/search.xml +76 -0
- data/spec/responses/subjects_ruby.xml +36 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/support/helpers.rb +8 -0
- data/spec/units/access_key_set_spec.rb +98 -0
- data/spec/units/nil_spec.rb +9 -0
- data/spec/units/query_spec.rb +179 -0
- data/spec/units/result_set_spec.rb +89 -0
- data/spec/units/result_spec.rb +105 -0
- data/spec/units/string_spec.rb +118 -0
- metadata +110 -81
- data/.document +0 -5
- data/ACKNOWLEDGEMENTS +0 -3
- data/LICENSE.txt +0 -20
- data/VERSION +0 -1
- data/test/helper.rb +0 -23
- data/test/test_isbndb.rb +0 -77
data/lib/isbndb/result.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module ISBNdb
|
2
|
-
|
2
|
+
|
3
3
|
private
|
4
4
|
# The Result object is a true testament of metaprogramming. Almost every method of the Result
|
5
5
|
# is dynamically generated through the build_result() method. All attribtues of the XML are
|
@@ -9,52 +9,51 @@ module ISBNdb
|
|
9
9
|
class Result
|
10
10
|
# Initialize simply calls build_result. Because the method definition is recusive, it must
|
11
11
|
# be moved into a separate helper.
|
12
|
-
def initialize(
|
13
|
-
build_result(
|
12
|
+
def initialize(json = {})
|
13
|
+
@store = build_result(json)
|
14
14
|
end
|
15
|
-
|
16
|
-
# Because a result may or may not contain a specified key, we always return nil for
|
15
|
+
|
16
|
+
# Because a result may or may not contain a specified key, we always return nil for
|
17
17
|
# consistency. This allows developers to easily check for .nil? instead of checking for
|
18
|
-
# a
|
18
|
+
# a myriad of exceptions throughout their code.
|
19
19
|
def method_missing(m, *args, &block)
|
20
|
-
|
20
|
+
@store[m.to_s.underscore]
|
21
21
|
end
|
22
|
-
|
23
|
-
#
|
22
|
+
|
23
|
+
# Return a list of all "methods" this class responds to
|
24
|
+
def instance_methods
|
25
|
+
@store.collect{ |key,value| key.to_s }
|
26
|
+
end
|
27
|
+
|
28
|
+
# Pretty print the Result including the number of singleton methods that exist. If
|
24
29
|
# you want the ACTUAL singleton methods, call @result.singleton_methods.
|
25
30
|
def to_s
|
26
|
-
@
|
27
|
-
"#<Result @num_singleton_methods=#{@singleton_methods.size}>"
|
31
|
+
"#<Result @num_singleton_methods=#{@store.size}>"
|
28
32
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
# the content of each XML node, dynamically sends a method to the instance with that attribute's
|
33
|
-
# or content's value. Not to be outdone, it recursively iterates over all children too!
|
34
|
-
def build_result(top_node)
|
35
|
-
top_node.attributes.each do |attribute|
|
36
|
-
singleton.send(:define_method, method_name(attribute.name)) { attribute.value } unless attribute.value.strip.empty?
|
37
|
-
end
|
38
|
-
|
39
|
-
if top_node.children?
|
40
|
-
top_node.children.each { |child| build_result(child) }
|
41
|
-
else
|
42
|
-
singleton.send(:define_method, method_name(top_node.parent.name)) { top_node.content.strip.chomp(',') } unless top_node.content.strip.empty?
|
43
|
-
end
|
33
|
+
|
34
|
+
def inspect
|
35
|
+
"#<Result #{@store.collect{ |key,value| ':' + key.to_s + ' => ' + value.inspect }.join(', ')}>"
|
44
36
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
# converted from CamelCase to under_score, and converted to a symbol
|
49
|
-
def method_name(name)
|
50
|
-
name.strip.underscore.to_sym
|
37
|
+
|
38
|
+
def ==(result)
|
39
|
+
self.inspect == result.inspect
|
51
40
|
end
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
41
|
+
|
42
|
+
private
|
43
|
+
def build_result(json)
|
44
|
+
result = {}
|
45
|
+
|
46
|
+
json.each do |key,value|
|
47
|
+
result[key.to_s.underscore] = if value.is_a?(Hash)
|
48
|
+
build_result(value)
|
49
|
+
elsif value.blank?
|
50
|
+
nil
|
51
|
+
else
|
52
|
+
value
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
result
|
58
57
|
end
|
59
58
|
end
|
60
|
-
end
|
59
|
+
end
|
data/lib/isbndb/result_set.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
module ISBNdb
|
2
|
-
|
2
|
+
|
3
3
|
private
|
4
4
|
# The ResultSet is a collection of Result objects with helper methods for pagination. It
|
5
5
|
# allows for easy paginating through multiple pages of results as well as jumping to a
|
6
6
|
# specific results page.
|
7
7
|
class ResultSet
|
8
8
|
include Enumerable
|
9
|
-
|
9
|
+
include HTTParty
|
10
|
+
|
11
|
+
base_uri 'http://isbndb.com/api'
|
12
|
+
headers 'Content-Type' => 'text/xml'
|
13
|
+
|
10
14
|
# This method creates instance variables for @uri, @collection, and @current_page. It then
|
11
15
|
# attempts to parse the XML at the gieven URI. If it cannot parse the URI for any reason,
|
12
16
|
# it will raise an ISBNdb::InvalidURIError. Next, the results are checked for an any error
|
@@ -14,76 +18,71 @@ module ISBNdb
|
|
14
18
|
# Finally, this method then actually builds the ResultSet.
|
15
19
|
def initialize(uri, collection, current_page = 1)
|
16
20
|
@uri = uri
|
17
|
-
@collection = collection
|
21
|
+
@collection = collection.to_s.titleize.singularize
|
18
22
|
@current_page = current_page
|
19
|
-
@
|
20
|
-
|
23
|
+
@parsed_response = self.class.get(@uri).parsed_response['ISBNdb']
|
24
|
+
|
21
25
|
check_results
|
22
26
|
build_results
|
23
27
|
end
|
24
|
-
|
28
|
+
|
29
|
+
def size
|
30
|
+
@results.size
|
31
|
+
end
|
32
|
+
|
25
33
|
# Because ResultSet extends Enumerable, we need to define the each method. This allows users
|
26
34
|
# to call methods like .first, .last, [5], and .each on the ResultSet, making it behave like
|
27
35
|
# a primitive array.
|
28
36
|
def each(&block)
|
29
37
|
@results.each &block
|
30
38
|
end
|
31
|
-
|
39
|
+
|
32
40
|
# Jump to a specific page. This method will return nil if the specified page does not exist.
|
33
41
|
def go_to_page(page)
|
34
42
|
get_total_pages unless @total_pages
|
35
|
-
return nil if page < 1 || page > @total_pages
|
43
|
+
return nil if page.to_i < 1 || page.to_i > @total_pages
|
36
44
|
ISBNdb::ResultSet.new("#{@uri}&page_number=#{page}", @collection, page)
|
37
45
|
end
|
38
|
-
|
46
|
+
|
39
47
|
# Go to the next page. This method will return nil if a next page does not exist.
|
40
48
|
def next_page
|
41
49
|
go_to_page(@current_page+1)
|
42
50
|
end
|
43
|
-
|
51
|
+
|
44
52
|
# Go to the previous page. This method will return nil if a previous page does not exist.
|
45
53
|
def prev_page
|
46
54
|
go_to_page(@current_page-1)
|
47
55
|
end
|
48
|
-
|
56
|
+
|
49
57
|
# Pretty prints the Result set information.
|
50
58
|
def to_s
|
51
|
-
"#<ResultSet
|
59
|
+
"#<ResultSet::#{@collection} :total_results => #{@results.size}>"
|
52
60
|
end
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
# raises ISBNdb::InvalidURIError.
|
57
|
-
def parse_xml
|
58
|
-
begin
|
59
|
-
LibXML::XML::Parser.file(@uri).parse
|
60
|
-
rescue
|
61
|
-
raise ISBNdb::InvalidURIError
|
62
|
-
end
|
61
|
+
|
62
|
+
def ==(result_set)
|
63
|
+
self.size == result_set.size && self.instance_variable_get('@results') == result_set.instance_variable_get('@results')
|
63
64
|
end
|
64
|
-
|
65
|
-
|
65
|
+
|
66
|
+
private
|
67
|
+
# Check the results for an error message. If one exists, raise an ISBNdb::AccessKeyError for now.
|
66
68
|
# Currently the API does not differentiate between an overloaded API key and an invalid one
|
67
69
|
# (it returns the same exact response), so there only exists one exception for now...
|
68
70
|
def check_results
|
69
|
-
raise ISBNdb::AccessKeyError
|
71
|
+
raise ISBNdb::AccessKeyError if @parsed_response['ErrorMessage']
|
70
72
|
end
|
71
|
-
|
73
|
+
|
72
74
|
# Iterate over #{@collection}List/#{@collection}Data (ex. BookList/BookData) and build a result with
|
73
75
|
# each child. This method works because the API always returns #{@collection}List followed by a subset
|
74
76
|
# of #{@collection}Data. These results are all pushed into the @results array for accessing.
|
75
77
|
def build_results
|
76
|
-
@results = []
|
77
|
-
list = @xml.find("#{@collection}List/#{@collection}Data")
|
78
|
-
return [nil] if list.empty?
|
79
|
-
list.collect { |node| @results << Result.new(node) }
|
78
|
+
@results = @parsed_response["#{@collection}List"]["#{@collection}Data"].collect{ |json| Result.new(json) }
|
80
79
|
end
|
81
|
-
|
80
|
+
|
82
81
|
# This helper method is mainly designed for use with the go_to_page(page) method. It parses the XML
|
83
82
|
# and returns the total number of pages that exist for this result set.
|
84
83
|
def get_total_pages
|
85
|
-
list = @
|
84
|
+
list = @parsed_response["#{@collection}List"]
|
86
85
|
@total_pages = (list['total_results'].to_f/list['page_size'].to_f).ceil
|
87
86
|
end
|
88
87
|
end
|
89
|
-
end
|
88
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<ISBNdb server_time="2012-06-16T20:26:27Z">
|
4
|
+
<AuthorList total_results="401" page_size="10" page_number="1" shown_results="10">
|
5
|
+
<AuthorData person_id="abraham_seth">
|
6
|
+
<Name>Abraham, Seth</Name>
|
7
|
+
<Details first_name="Seth" last_name="Abraham" dates="" has_books="1" />
|
8
|
+
</AuthorData>
|
9
|
+
<AuthorData person_id="abramson_seth_f">
|
10
|
+
<Name>Abramson, Seth F.</Name>
|
11
|
+
<Details first_name="Seth" last_name="Abramson" dates="1926-" has_books="1" />
|
12
|
+
</AuthorData>
|
13
|
+
<AuthorData person_id="adams_seth">
|
14
|
+
<Name>Adams, Seth</Name>
|
15
|
+
<Details first_name="Seth" last_name="Adams" dates="" has_books="1" />
|
16
|
+
</AuthorData>
|
17
|
+
<AuthorData person_id="seth_afikorah_danquah">
|
18
|
+
<Name>Seth Afikorah-Danquah</Name>
|
19
|
+
<Details first_name="Seth" last_name="Afikorah-Danquah" dates="" has_books="1" />
|
20
|
+
</AuthorData>
|
21
|
+
<AuthorData person_id="agata_seth_h">
|
22
|
+
<Name>Agata, Seth H</Name>
|
23
|
+
<Details first_name="Seth" last_name="Agata" dates="" has_books="1" />
|
24
|
+
</AuthorData>
|
25
|
+
<AuthorData person_id="agbo_seth_a">
|
26
|
+
<Name>Agbo, Seth A.</Name>
|
27
|
+
<Details first_name="Seth" last_name="Agbo" dates="1951-" has_books="1" />
|
28
|
+
</AuthorData>
|
29
|
+
<AuthorData person_id="allcorn_seth">
|
30
|
+
<Name>Allcorn, Seth</Name>
|
31
|
+
<Details first_name="Seth" last_name="Allcorn" dates="" has_books="1" />
|
32
|
+
</AuthorData>
|
33
|
+
<AuthorData person_id="ames_seth">
|
34
|
+
<Name>Ames, Seth</Name>
|
35
|
+
<Details first_name="Seth" last_name="Ames" dates="1805-1881." has_books="1" />
|
36
|
+
</AuthorData>
|
37
|
+
<AuthorData person_id="anderson_seth_b">
|
38
|
+
<Name>Anderson, Seth B.</Name>
|
39
|
+
<Details first_name="Seth" last_name="Anderson" dates="" has_books="1" />
|
40
|
+
</AuthorData>
|
41
|
+
<AuthorData person_id="seth_andrew_a01">
|
42
|
+
<Name>Seth Andrew</Name>
|
43
|
+
<Details first_name="Seth" last_name="Andrew" dates="" has_books="1" />
|
44
|
+
</AuthorData>
|
45
|
+
</AuthorList>
|
46
|
+
</ISBNdb>
|
@@ -0,0 +1,76 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<ISBNdb server_time="2012-06-16T20:10:13Z">
|
4
|
+
<BookList total_results="1664" page_size="10" page_number="1" shown_results="10">
|
5
|
+
<BookData book_id="100th_day_of_school_a04" isbn="1590543947" isbn13="9781590543948">
|
6
|
+
<Title>100th Day of School</Title>
|
7
|
+
<TitleLong>100th Day of School (Hello Reader Level 2)</TitleLong>
|
8
|
+
<AuthorsText>Angela Shelf Medearis, </AuthorsText>
|
9
|
+
<PublisherText publisher_id="fitzgerald_books">Fitzgerald Books</PublisherText>
|
10
|
+
<Details change_time="2011-03-08T18:28:45Z" price_time="2012-05-29T16:45:46Z" edition_info="Unknown Binding; 2007-01" language="" physical_description_text="6.0"x9.0"x0.5"; 0.4 lb; 32 pages" lcc_number="" dewey_decimal_normalized="" dewey_decimal="" />
|
11
|
+
</BookData>
|
12
|
+
<BookData book_id="100th_day_the" isbn="0439330173" isbn13="9780439330176">
|
13
|
+
<Title>100th Day, The</Title>
|
14
|
+
<TitleLong>100th Day, The (level 1) (Hello Reader Level 1)</TitleLong>
|
15
|
+
<AuthorsText>Alayne Pick, Grace Maccarone, Laura Freeman (Illustrator)</AuthorsText>
|
16
|
+
<PublisherText publisher_id="cartwheel">Cartwheel</PublisherText>
|
17
|
+
<Details change_time="2006-02-27T21:34:15Z" price_time="2012-05-29T16:46:08Z" edition_info="Paperback; 2002-12-01" language="" physical_description_text="32 pages" lcc_number="" dewey_decimal_normalized="" dewey_decimal="" />
|
18
|
+
</BookData>
|
19
|
+
<BookData book_id="2011_hello_kitty_engagement_calendar" isbn="1423803558" isbn13="9781423803553">
|
20
|
+
<Title>2011 Hello Kitty Engagement Calendar</Title>
|
21
|
+
<TitleLong></TitleLong>
|
22
|
+
<AuthorsText>Day Dream (Contributor)</AuthorsText>
|
23
|
+
<PublisherText publisher_id="day_dream">Day Dream</PublisherText>
|
24
|
+
<Details change_time="2010-09-21T21:20:39Z" price_time="2012-03-24T04:44:44Z" edition_info="Calendar; 2010-08-01" language="" physical_description_text="7.0"x8.5"x0.9"; 1.1 lb" lcc_number="" dewey_decimal_normalized="741" dewey_decimal="741" />
|
25
|
+
</BookData>
|
26
|
+
<BookData book_id="2011_hello_kitty_wall_calendar" isbn="1423803981" isbn13="9781423803980">
|
27
|
+
<Title>2011 Hello Kitty Wall Calendar</Title>
|
28
|
+
<TitleLong></TitleLong>
|
29
|
+
<AuthorsText>Day Dream (Contributor)</AuthorsText>
|
30
|
+
<PublisherText publisher_id="day_dream">Day Dream</PublisherText>
|
31
|
+
<Details change_time="2010-09-21T18:46:02Z" price_time="2012-04-25T20:26:40Z" edition_info="Calendar; 2010-08-01" language="" physical_description_text="10.8"x11.8"x0.2"; 0.3 lb" lcc_number="" dewey_decimal_normalized="" dewey_decimal="" />
|
32
|
+
</BookData>
|
33
|
+
<BookData book_id="2012_hello_kitty_2_year_pocket_planner_calendar" isbn="1423809424" isbn13="9781423809425">
|
34
|
+
<Title>2012 Hello Kitty 2 Year Pocket Planner Calendar</Title>
|
35
|
+
<TitleLong></TitleLong>
|
36
|
+
<AuthorsText>Day Dream, </AuthorsText>
|
37
|
+
<PublisherText publisher_id="day_dream">Day Dream</PublisherText>
|
38
|
+
<Details change_time="2012-01-17T22:23:43Z" price_time="2012-03-04T05:32:03Z" edition_info="Calendar; 2011-07-01" language="" physical_description_text="3.5"x6.2"x0.0"; 0.1 lb" lcc_number="" dewey_decimal_normalized="636" dewey_decimal="636" />
|
39
|
+
</BookData>
|
40
|
+
<BookData book_id="2012_hello_kitty_juvenile_activity_calendar" isbn="1423811194" isbn13="9781423811190">
|
41
|
+
<Title>2012 Hello Kitty Juvenile Activity Calendar</Title>
|
42
|
+
<TitleLong></TitleLong>
|
43
|
+
<AuthorsText>Day Dream, </AuthorsText>
|
44
|
+
<PublisherText publisher_id="day_dream">Day Dream</PublisherText>
|
45
|
+
<Details change_time="2012-05-15T00:52:54Z" price_time="2012-06-16T20:10:13Z" edition_info="Calendar; 2011-07-01" language="" physical_description_text="11.0"x12.0"x0.3"; 0.8 lb" lcc_number="" dewey_decimal_normalized="741" dewey_decimal="741" />
|
46
|
+
</BookData>
|
47
|
+
<BookData book_id="2012_hello_kitty_mini_calendar" isbn="1423809165" isbn13="9781423809166">
|
48
|
+
<Title>2012 Hello Kitty Mini Calendar</Title>
|
49
|
+
<TitleLong></TitleLong>
|
50
|
+
<AuthorsText>Day Dream, </AuthorsText>
|
51
|
+
<PublisherText publisher_id="day_dream">Day Dream</PublisherText>
|
52
|
+
<Details change_time="2012-01-17T22:24:12Z" price_time="2012-02-09T06:11:01Z" edition_info="Calendar; 2011-07-01" language="" physical_description_text="6.2"x6.9"x0.2"; 0.1 lb" lcc_number="" dewey_decimal_normalized="741" dewey_decimal="741" />
|
53
|
+
</BookData>
|
54
|
+
<BookData book_id="2012_hello_kitty_wall_calendar" isbn="1423809696" isbn13="9781423809692">
|
55
|
+
<Title>2012 Hello Kitty Wall Calendar</Title>
|
56
|
+
<TitleLong></TitleLong>
|
57
|
+
<AuthorsText>Day Dream, </AuthorsText>
|
58
|
+
<PublisherText publisher_id="day_dream">Day Dream</PublisherText>
|
59
|
+
<Details change_time="2012-01-17T22:14:27Z" price_time="2012-02-09T06:02:14Z" edition_info="Calendar; 2011-07-01" language="" physical_description_text="10.6"x11.8"x0.2"; 0.5 lb" lcc_number="" dewey_decimal_normalized="741" dewey_decimal="741" />
|
60
|
+
</BookData>
|
61
|
+
<BookData book_id="2012_hello_kitty_weekly_engagement_calendar" isbn="1423809092" isbn13="9781423809098">
|
62
|
+
<Title>2012 Hello Kitty Weekly Engagement Calendar</Title>
|
63
|
+
<TitleLong></TitleLong>
|
64
|
+
<AuthorsText>Day Dream, </AuthorsText>
|
65
|
+
<PublisherText publisher_id="day_dream">Day Dream</PublisherText>
|
66
|
+
<Details change_time="2012-01-17T22:14:34Z" price_time="2012-02-08T12:37:05Z" edition_info="Calendar; 2011-07-01" language="" physical_description_text="7.2"x8.5"x0.9"; 1.0 lb" lcc_number="" dewey_decimal_normalized="741" dewey_decimal="741" />
|
67
|
+
</BookData>
|
68
|
+
<BookData book_id="2_grrrls_hello_gorgeous" isbn="0439187370" isbn13="9780439187374">
|
69
|
+
<Title>Hello gorgeous</Title>
|
70
|
+
<TitleLong>Hello gorgeous: a guide to style</TitleLong>
|
71
|
+
<AuthorsText>by Kristen Kemp</AuthorsText>
|
72
|
+
<PublisherText publisher_id="scholastic">New York : Scholastic, c2000.</PublisherText>
|
73
|
+
<Details change_time="2009-09-29T18:09:13Z" price_time="2011-03-25T22:20:05Z" edition_info="(pbk.) :$3.99" language="eng" physical_description_text="64 p. : ill. (some col.) ; 20 cm." lcc_number="" dewey_decimal_normalized="" dewey_decimal="" />
|
74
|
+
</BookData>
|
75
|
+
</BookList>
|
76
|
+
</ISBNdb>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<ISBNdb server_time="2012-06-16T20:36:49Z">
|
4
|
+
<CategoryList total_results="99" page_size="10" page_number="1" shown_results="10">
|
5
|
+
<CategoryData category_id="society.religion.christianity.denominations.catholicism.literature.fiction" parent_id="society.religion.christianity.denominations.catholicism.literature">
|
6
|
+
<Name>Fiction</Name>
|
7
|
+
<Details summary="" depth="6" element_count="30" />
|
8
|
+
</CategoryData>
|
9
|
+
<CategoryData category_id="society.religion.christianity.denominations.catholicism.clergy.fiction" parent_id="society.religion.christianity.denominations.catholicism.clergy">
|
10
|
+
<Name>Fiction</Name>
|
11
|
+
<Details summary="" depth="6" element_count="16" />
|
12
|
+
</CategoryData>
|
13
|
+
<CategoryData category_id="society.family.family_members.fathers.single_and_divorced.fiction" parent_id="society.family.family_members.fathers.single_and_divorced">
|
14
|
+
<Name>Fiction</Name>
|
15
|
+
<Details summary="" depth="5" element_count="7" />
|
16
|
+
</CategoryData>
|
17
|
+
<CategoryData category_id="society.family.family_members.mothers.single_and_divorced.fiction" parent_id="society.family.family_members.mothers.single_and_divorced">
|
18
|
+
<Name>Fiction</Name>
|
19
|
+
<Details summary="" depth="5" element_count="25" />
|
20
|
+
</CategoryData>
|
21
|
+
<CategoryData category_id="society.family.family_members.mothers.working_mothers.fiction" parent_id="society.family.family_members.mothers.working_mothers">
|
22
|
+
<Name>Fiction</Name>
|
23
|
+
<Details summary="" depth="5" element_count="6" />
|
24
|
+
</CategoryData>
|
25
|
+
<CategoryData category_id="society.family.family_members.mothers.teenage_mothers.fiction" parent_id="society.family.family_members.mothers.teenage_mothers">
|
26
|
+
<Name>Fiction</Name>
|
27
|
+
<Details summary="" depth="5" element_count="4" />
|
28
|
+
</CategoryData>
|
29
|
+
<CategoryData category_id="society.sexuality.homosexuality.lesbians.literature.fiction" parent_id="society.sexuality.homosexuality.lesbians.literature">
|
30
|
+
<Name>Fiction</Name>
|
31
|
+
<Details summary="" depth="5" element_count="24" />
|
32
|
+
</CategoryData>
|
33
|
+
<CategoryData category_id="arts.music.styles.jazz.musicians.fiction" parent_id="arts.music.styles.jazz.musicians">
|
34
|
+
<Name>Fiction</Name>
|
35
|
+
<Details summary="" depth="5" element_count="6" />
|
36
|
+
</CategoryData>
|
37
|
+
<CategoryData category_id="regions.france.history.famous_people.napoleon_i.fiction" parent_id="regions.france.history.famous_people.napoleon_i">
|
38
|
+
<Name>Fiction</Name>
|
39
|
+
<Details summary="" depth="5" element_count="4" />
|
40
|
+
</CategoryData>
|
41
|
+
<CategoryData category_id="science.biology.fields.genetics.literature.fiction" parent_id="science.biology.fields.genetics.literature">
|
42
|
+
<Name>Fiction</Name>
|
43
|
+
<Details summary="" depth="5" element_count="3" />
|
44
|
+
</CategoryData>
|
45
|
+
</CategoryList>
|
46
|
+
</ISBNdb>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<ISBNdb server_time="2012-06-16T20:42:39Z">
|
4
|
+
<PublisherList total_results="276" page_size="10" page_number="1" shown_results="10">
|
5
|
+
<PublisherData publisher_id="taylor_francis_a01">
|
6
|
+
<Name>: Taylor & Francis</Name>
|
7
|
+
<Details location="London [etc.]" />
|
8
|
+
</PublisherData>
|
9
|
+
<PublisherData publisher_id="a_a_balkema_taylor_francis">
|
10
|
+
<Name>A.A. Balkema/Taylor & Francis</Name>
|
11
|
+
<Details location="Leiden, The Netherlands" />
|
12
|
+
</PublisherData>
|
13
|
+
<PublisherData publisher_id="albert_francis_perrin">
|
14
|
+
<Name>Albert Francis Perrin</Name>
|
15
|
+
<Details location="Ottawa" />
|
16
|
+
</PublisherData>
|
17
|
+
<PublisherData publisher_id="auerbach_publications_tayl_a02">
|
18
|
+
<Name>Auerbach Publications, Taylor & Francis Group</Name>
|
19
|
+
<Details location="Boca Raton, FL" />
|
20
|
+
</PublisherData>
|
21
|
+
<PublisherData publisher_id="auerbach_publications_tayl_a01">
|
22
|
+
<Name>Auerbach Publications/Taylor & Francis</Name>
|
23
|
+
<Details location="Boca Raton, FL" />
|
24
|
+
</PublisherData>
|
25
|
+
<PublisherData publisher_id="auerbach_publications_taylor_f">
|
26
|
+
<Name>Auerbach Publications/Taylor & Francis Group</Name>
|
27
|
+
<Details location="Boca Raton, FL" />
|
28
|
+
</PublisherData>
|
29
|
+
<PublisherData publisher_id="auerbach_taylor_francis">
|
30
|
+
<Name>Auerbach/Taylor&Francis</Name>
|
31
|
+
<Details location="Boca Raton" />
|
32
|
+
</PublisherData>
|
33
|
+
<PublisherData publisher_id="b_francis">
|
34
|
+
<Name>B. Francis</Name>
|
35
|
+
<Details location="[Coolangatta, Qld.]" />
|
36
|
+
</PublisherData>
|
37
|
+
<PublisherData publisher_id="balkema_taylor_francis">
|
38
|
+
<Name>Balkema/Taylor & Francis</Name>
|
39
|
+
<Details location="[London]" />
|
40
|
+
</PublisherData>
|
41
|
+
<PublisherData publisher_id="beau_francis_press">
|
42
|
+
<Name>Beau Francis Press</Name>
|
43
|
+
<Details location="" />
|
44
|
+
</PublisherData>
|
45
|
+
</PublisherList>
|
46
|
+
</ISBNdb>
|