introduce Marc field validator, default is strict validating using blank as default symbol

This commit is contained in:
Jörg Prante 2022-10-16 00:29:26 +02:00
parent 153bac0a3f
commit ca08925478
73 changed files with 1967 additions and 22293 deletions

View file

@ -1,18 +1,17 @@
/* /**
Copyright 2016 Jörg Prante * Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
You may obtain a copy of the License at * You may obtain a copy of the License at
*
http://www.apache.org/licenses/LICENSE-2.0 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
limitations under the License. * limitations under the License.
*/ */
package org.xbib.marc; package org.xbib.marc;

View file

@ -1,18 +1,17 @@
/* /**
Copyright 2016 Jörg Prante * Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
You may obtain a copy of the License at * You may obtain a copy of the License at
*
http://www.apache.org/licenses/LICENSE-2.0 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
limitations under the License. * limitations under the License.
*/ */
package org.xbib.marc; package org.xbib.marc;
@ -619,7 +618,7 @@ public final class Marc {
private InputStream inputStream; private InputStream inputStream;
private Charset charset = StandardCharsets.UTF_8; private Charset charset;
private String schema; private String schema;
@ -627,11 +626,11 @@ public final class Marc {
private InverseMarcContentHandler defaultContentHandler; private InverseMarcContentHandler defaultContentHandler;
private final Map<String, Boolean> features = new HashMap<>(); private final Map<String, Boolean> features;
private final Map<String, Object> properties = new HashMap<>(); private final Map<String, Object> properties;
private Map<String, MarcListener> listeners = new HashMap<>(); private final Map<String, MarcListener> listeners;
private MarcListener listener; private MarcListener listener;
@ -643,11 +642,13 @@ public final class Marc {
private MarcFieldTransformers marcFieldTransformers; private MarcFieldTransformers marcFieldTransformers;
private MarcFieldValidator validator;
private String format; private String format;
private String type; private String type;
private boolean fatalErrors = false; private boolean fatalErrors;
private MarcRecordListener marcRecordListener; private MarcRecordListener marcRecordListener;
@ -668,8 +669,21 @@ public final class Marc {
private Pattern valuePattern; private Pattern valuePattern;
private Builder() { private Builder() {
this.charset = StandardCharsets.UTF_8;
this.recordLabel = RecordLabel.EMPTY; this.recordLabel = RecordLabel.EMPTY;
this.marcFieldList = new LinkedList<>(); this.marcFieldList = new LinkedList<>();
this.features = new HashMap<>();
this.properties = new HashMap<>();
this.listeners = new HashMap<>();
this.validator = MarcField.DEFAULT_VALIDATOR;
}
public Builder setValidator(MarcFieldValidator validator) {
this.validator = validator;
if (marcGenerator != null) {
marcGenerator.setValidator(validator);
}
return this;
} }
public Builder setFormat(String format) { public Builder setFormat(String format) {
@ -860,6 +874,7 @@ public final class Marc {
*/ */
public MarcGenerator createGenerator() { public MarcGenerator createGenerator() {
this.marcGenerator = new MarcGenerator() this.marcGenerator = new MarcGenerator()
.setValidator(validator)
.setFormat(format) .setFormat(format)
.setType(type) .setType(type)
.setCharset(charset) .setCharset(charset)

View file

@ -1,30 +1,25 @@
/* /**
Copyright 2016 Jörg Prante * Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
You may obtain a copy of the License at * You may obtain a copy of the License at
*
http://www.apache.org/licenses/LICENSE-2.0 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
limitations under the License. * limitations under the License.
*/ */
package org.xbib.marc; package org.xbib.marc;
import org.xbib.marc.dialects.mab.MabSubfieldControl; import org.xbib.marc.dialects.mab.MabSubfieldControl;
import org.xbib.marc.label.RecordLabel; import org.xbib.marc.label.RecordLabel;
import java.util.Arrays;
import java.util.Deque; import java.util.Deque;
import java.util.HashSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Set;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -33,63 +28,20 @@ import java.util.stream.Collectors;
*/ */
public class MarcField implements Comparable<MarcField> { public class MarcField implements Comparable<MarcField> {
private static final MarcField EMPTY = builder().build(); private static final MarcField EMPTY_FIELD = builder().build();
private static final Subfield EMPTY_SUBFIELD = new Subfield(null, null); private static final Subfield EMPTY_SUBFIELD = new Subfield(null, null);
public static final String KEY_DELIMITER = "$";
private static final String EMPTY_STRING = ""; private static final String EMPTY_STRING = "";
private static final String BLANK_STRING = " "; public static final MarcFieldValidator DEFAULT_VALIDATOR = new StrictMarcFieldValidator();
private static final char UNDERSCORE = '_'; public static final String DELIMITER = "$";
private static final String UNDERSCORE_STRING = "_"; private final Builder builder;
private static final String EMPTY_TAG = "___";
private static final Set<Character> ASCII_GRAPHICS = new HashSet<>(Arrays.asList( private MarcField(Builder builder) {
'\u0020', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\'', this.builder = builder;
'\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'\u003A', '\u003B', '\u003C', '\u003D', '\u003E', '\u003F', '\u0040',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z',
'\u005B', '\\', '\u005D', '\u005E', '\u005F', '\u0060',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z',
'\u007B', '\u007C', '\u007D', '\u007E'
));
private final String tag;
private final String indicator;
private final int position;
private final int length;
private final String value;
private final String subfieldIds;
private final Deque<Subfield> subfields;
private final boolean iscontrol;
private MarcField(String tag, String indicator, int position, int length,
String value, Deque<Subfield> subfields, String subfieldIds,
boolean iscontrol) {
this.tag = tag;
this.indicator = indicator;
this.position = position;
this.length = length;
this.value = value;
this.subfields = subfields;
this.subfieldIds = subfieldIds;
this.iscontrol = iscontrol;
} }
/** /**
@ -101,7 +53,7 @@ public class MarcField implements Comparable<MarcField> {
} }
public static MarcField emptyMarcField() { public static MarcField emptyMarcField() {
return EMPTY; return EMPTY_FIELD;
} }
public static Subfield emptySubfield() { public static Subfield emptySubfield() {
@ -113,7 +65,7 @@ public class MarcField implements Comparable<MarcField> {
* @return the tag * @return the tag
*/ */
public String getTag() { public String getTag() {
return tag; return builder.tag;
} }
/** /**
@ -121,7 +73,7 @@ public class MarcField implements Comparable<MarcField> {
* @return the indicator * @return the indicator
*/ */
public String getIndicator() { public String getIndicator() {
return indicator; return builder.indicator;
} }
/** /**
@ -129,7 +81,7 @@ public class MarcField implements Comparable<MarcField> {
* @return position * @return position
*/ */
public int getPosition() { public int getPosition() {
return position; return builder.position;
} }
/** /**
@ -137,7 +89,7 @@ public class MarcField implements Comparable<MarcField> {
* @return the MARC field length * @return the MARC field length
*/ */
public int getLength() { public int getLength() {
return length; return builder.length;
} }
/** /**
@ -145,7 +97,7 @@ public class MarcField implements Comparable<MarcField> {
* @return a list of MARC subfields * @return a list of MARC subfields
*/ */
public Deque<Subfield> getSubfields() { public Deque<Subfield> getSubfields() {
return subfields; return builder.subfields;
} }
/** /**
@ -154,7 +106,7 @@ public class MarcField implements Comparable<MarcField> {
* @return list of subfields * @return list of subfields
*/ */
public Deque<Subfield> getSubfield(String subfieldId) { public Deque<Subfield> getSubfield(String subfieldId) {
return subfields.stream() return builder.subfields.stream()
.filter(subfield -> subfield.getId().equals(subfieldId)) .filter(subfield -> subfield.getId().equals(subfieldId))
.collect(Collectors.toCollection(LinkedList::new)); .collect(Collectors.toCollection(LinkedList::new));
} }
@ -164,7 +116,7 @@ public class MarcField implements Comparable<MarcField> {
* @return first subfield or null * @return first subfield or null
*/ */
public Subfield getFirstSubfield() { public Subfield getFirstSubfield() {
return subfields.isEmpty() ? MarcField.emptySubfield() : subfields.getFirst(); return builder.subfields.isEmpty() ? emptySubfield() : builder.subfields.getFirst();
} }
public String getFirstSubfieldValue(String subfieldId) { public String getFirstSubfieldValue(String subfieldId) {
@ -177,7 +129,7 @@ public class MarcField implements Comparable<MarcField> {
* @return last subfield or null * @return last subfield or null
*/ */
public Subfield getLastSubfield() { public Subfield getLastSubfield() {
return subfields.isEmpty() ? MarcField.emptySubfield() : subfields.getLast(); return builder.subfields.isEmpty() ? emptySubfield() : builder.subfields.getLast();
} }
public String getLastSubfieldValue(String subfieldId) { public String getLastSubfieldValue(String subfieldId) {
@ -191,7 +143,7 @@ public class MarcField implements Comparable<MarcField> {
* @return the field value * @return the field value
*/ */
public String getValue() { public String getValue() {
return value; return builder.value;
} }
/** /**
@ -199,7 +151,7 @@ public class MarcField implements Comparable<MarcField> {
* @return true if control field, false if not * @return true if control field, false if not
*/ */
public boolean isControl() { public boolean isControl() {
return iscontrol; return builder.isControl();
} }
/** /**
@ -207,64 +159,31 @@ public class MarcField implements Comparable<MarcField> {
* @return true if MARC field is empty, false if not * @return true if MARC field is empty, false if not
*/ */
public boolean isEmpty() { public boolean isEmpty() {
return tag == null; return builder.tag == null;
} }
public boolean isTagValid() { public boolean isTagValid() {
if (tag == null) { return builder.validator.isTagValid(builder.tag);
// we allow no tag
return true;
}
// only tags of length 3 are supposed to be valid
return tag.length() == 3
&& ((tag.charAt(0) >= '0' && tag.charAt(0) <= '9')
|| (tag.charAt(0) >= 'A' && tag.charAt(0) <= 'Z'))
&& ((tag.charAt(1) >= '0' && tag.charAt(1) <= '9')
|| (tag.charAt(1) >= 'A' && tag.charAt(1) <= 'Z'))
&& ((tag.charAt(2) >= '0' && tag.charAt(2) <= '9')
|| (tag.charAt(2) >= 'A' && tag.charAt(2) <= 'Z'));
} }
public boolean isIndicatorValid() { public boolean isIndicatorValid() {
if (isControl()) { if (builder.isControl()) {
// ignore indicator check for control fields // ignore indicator check for control fields
return true; return true;
} }
if (indicator == null) { if (builder.indicator == null) {
// we allow no indicator // we allow no indicator
return true; return true;
} }
boolean b = indicator.length() <= 9; return builder.validator.isIndicatorValid(builder.indicator);
for (int i = 0; i < indicator.length(); i++) {
b = indicator.charAt(i) == UNDERSCORE
|| (indicator.charAt(i) >= '0' && indicator.charAt(i) <= '9')
|| (indicator.charAt(i) >= 'a' && indicator.charAt(i) <= 'z')
|| (indicator.charAt(i) >= 'A' && indicator.charAt(i) <= 'Z')
|| indicator.charAt(i) == '@'; // must be valid, for PICA dialect
if (!b) {
break;
}
}
return b;
} }
public boolean isSubfieldValid() { public boolean areAllSubfieldsValid() {
if (isControl()) { if (isControl()) {
// for control fields, there are no subfields, disable check // for control fields, there are no subfields, disable check
return true; return true;
} }
if (subfieldIds == null) { return builder.subfields.stream().allMatch(s -> builder.validator.isSubfieldIdValid(s.getId()));
// we allow no subfield ids
return true;
}
boolean b = true;
for (int i = 0; i < subfieldIds.length(); i++) {
b = ASCII_GRAPHICS.contains(subfieldIds.charAt(i));
if (!b) {
break;
}
}
return b;
} }
/** /**
@ -272,7 +191,7 @@ public class MarcField implements Comparable<MarcField> {
* @return true if valid * @return true if valid
*/ */
public boolean isValid() { public boolean isValid() {
return isTagValid() && isIndicatorValid() && isSubfieldValid(); return isTagValid() && isIndicatorValid() && areAllSubfieldsValid();
} }
/** /**
@ -290,10 +209,10 @@ public class MarcField implements Comparable<MarcField> {
* @return thhis MARC field if pattern matches, or null if not * @return thhis MARC field if pattern matches, or null if not
*/ */
public MarcField matchValue(Pattern pattern) { public MarcField matchValue(Pattern pattern) {
if (value != null && pattern.matcher(value).matches()) { if (builder.value != null && pattern.matcher(builder.value).matches()) {
return this; return this;
} }
for (Subfield subfield : subfields) { for (Subfield subfield : builder.subfields) {
if (pattern.matcher(subfield.getValue()).matches()) { if (pattern.matcher(subfield.getValue()).matches()) {
return this; return this;
} }
@ -308,7 +227,7 @@ public class MarcField implements Comparable<MarcField> {
* @return the tag-based key of this MARC field * @return the tag-based key of this MARC field
*/ */
public String toTagKey() { public String toTagKey() {
return tag == null ? EMPTY_STRING : tag; return builder.tag == null ? EMPTY_STRING : builder.tag;
} }
/** /**
@ -318,15 +237,7 @@ public class MarcField implements Comparable<MarcField> {
* @return the tag/indicator-based key of this MARC field * @return the tag/indicator-based key of this MARC field
*/ */
public String toTagIndicatorKey() { public String toTagIndicatorKey() {
return (tag == null ? EMPTY_STRING : tag) + KEY_DELIMITER + (indicator == null ? EMPTY_STRING : indicator); return toTagKey() + DELIMITER + (builder.indicator == null ? EMPTY_STRING : builder.indicator);
}
/**
* Return subfield IDs.
* @return the subfield ID list as a string.
*/
public String getSubfieldIds() {
return subfieldIds;
} }
/** /**
@ -336,8 +247,15 @@ public class MarcField implements Comparable<MarcField> {
* @return the key of this MARC field * @return the key of this MARC field
*/ */
public String toKey() { public String toKey() {
return (tag == null ? EMPTY_STRING : tag) + KEY_DELIMITER + (indicator == null ? EMPTY_STRING : indicator) + return toTagIndicatorKey() + DELIMITER + getSubfieldIds();
KEY_DELIMITER + subfieldIds; }
/**
* Return subfield IDs.
* @return the subfield ID list as a string.
*/
public String getSubfieldIds() {
return builder.subfields.stream().map(Subfield::getId).sorted().collect(Collectors.joining());
} }
@Override @Override
@ -362,32 +280,34 @@ public class MarcField implements Comparable<MarcField> {
} }
/** /**
* MARC field builder. The builder accepts all information required for building * MARC field builder.
* a new MARC field. * The builder accepts all information required for building a new MARC field.
*/ */
public static class Builder { public static class Builder {
private static final String BLANK_STRING = " ";
private String tag; private String tag;
private String indicator; private String indicator;
private String value;
private int position; private int position;
private int length; private int length;
private String value;
private final LinkedList<Subfield> subfields; private final LinkedList<Subfield> subfields;
private final LinkedList<String> subfieldIds;
private Boolean isControl; private Boolean isControl;
private MarcFieldValidator validator;
Builder() { Builder() {
this.subfields = new LinkedList<>(); this.subfields = new LinkedList<>();
this.subfieldIds = new SubfieldIds();
this.position = -1; this.position = -1;
this.length = -1; this.length = -1;
this.validator = DEFAULT_VALIDATOR;
} }
/** /**
@ -396,19 +316,7 @@ public class MarcField implements Comparable<MarcField> {
* @return this builder * @return this builder
*/ */
public Builder tag(String tag) { public Builder tag(String tag) {
if (tag != null) { this.tag = validator.validateTag(tag);
// We have inconsistent use of tag symbols as placeholders for a "blank space"
// and we need to fix it here for consistency.
this.tag = tag
.replace('-', UNDERSCORE)
.replace('#', UNDERSCORE)
.replace('.', UNDERSCORE)
.replace(' ', UNDERSCORE);
}
// do not allow null or empty tags
if (this.tag == null || this.tag.isEmpty()) {
this.tag = EMPTY_TAG;
}
return this; return this;
} }
@ -426,23 +334,7 @@ public class MarcField implements Comparable<MarcField> {
* @return this builder * @return this builder
*/ */
public Builder indicator(String indicator) { public Builder indicator(String indicator) {
if (indicator != null) { this.indicator = validator.validateIndicator(indicator);
// We have inconsistent use of indicator symbols as placeholders for a "blank space"
// and we need to fix it here for consistency.
// Check if indicators are artifacts like "-" or "#" or '.' or ' '.
// Replace with underscore. This preserves better usage and visibility.
// Especially the dot. The dot will break Elasticsearch indexing with an exception.
// If you do not like underscores, replace them by a space character in your application.
this.indicator = indicator
.replace('-', UNDERSCORE)
.replace('#', UNDERSCORE)
.replace('.', UNDERSCORE)
.replace(' ', UNDERSCORE);
}
// we do not allow an empty indicator. Elasticsearch field names require a length > 0.
if (this.indicator != null && this.indicator.isEmpty()) {
this.indicator = UNDERSCORE_STRING;
}
return this; return this;
} }
@ -491,7 +383,8 @@ public class MarcField implements Comparable<MarcField> {
} }
/** /**
* Set value for control/data field. * Set value. The value is used for control/data fields.
*
* @param value the value * @param value the value
* @return this builder * @return this builder
*/ */
@ -502,7 +395,6 @@ public class MarcField implements Comparable<MarcField> {
public Builder subfield(Subfield subfield) { public Builder subfield(Subfield subfield) {
subfields.add(subfield); subfields.add(subfield);
subfieldIds.add(subfield.getId());
return this; return this;
} }
@ -513,13 +405,13 @@ public class MarcField implements Comparable<MarcField> {
* @return this builder * @return this builder
*/ */
public Builder subfield(String subfieldId, String value) { public Builder subfield(String subfieldId, String value) {
subfields.add(new Subfield(subfieldId, value)); String id = validator.validateSubfieldId(subfieldId);
subfieldIds.add(subfieldId); subfields.add(new Subfield(id, value));
return this; return this;
} }
/** /**
* Set subfield ID. * Add subfield ID without a value.
* @param subfieldId the subfield ID * @param subfieldId the subfield ID
* @return this builder * @return this builder
*/ */
@ -529,7 +421,7 @@ public class MarcField implements Comparable<MarcField> {
} }
/** /**
* Set subfield ID. * Add subfield ID.
* @param subfieldId the subfield ID * @param subfieldId the subfield ID
* @return this builder * @return this builder
*/ */
@ -584,7 +476,7 @@ public class MarcField implements Comparable<MarcField> {
if ("MAB".equals(format) && "Titel".equals(type)) { if ("MAB".equals(format) && "Titel".equals(type)) {
len = MabSubfieldControl.getSubfieldIdLen(tag()); len = MabSubfieldControl.getSubfieldIdLen(tag());
} }
boolean canDeriveSubfieldId = len > 0 && value.length() > len; boolean canDeriveSubfieldId = value.length() > len && len > 0;
if (canDeriveSubfieldId) { if (canDeriveSubfieldId) {
String id = value.substring(0, len); String id = value.substring(0, len);
String content = value.substring(len); String content = value.substring(len);
@ -598,6 +490,7 @@ public class MarcField implements Comparable<MarcField> {
/** /**
* Set a new field with help of a record label from raw data. * Set a new field with help of a record label from raw data.
*
* @param format the record format * @param format the record format
* @param type the record type * @param type the record type
* @param recordLabel the record label * @param recordLabel the record label
@ -623,7 +516,7 @@ public class MarcField implements Comparable<MarcField> {
} }
/** /**
* Copy a MARC field. * Copy a MARC field into this builder.
* @param field the MARC field to copy * @param field the MARC field to copy
* @return this builder * @return this builder
*/ */
@ -635,19 +528,17 @@ public class MarcField implements Comparable<MarcField> {
this.value = field.getValue(); this.value = field.getValue();
this.subfields.clear(); this.subfields.clear();
this.subfields.addAll(field.getSubfields()); this.subfields.addAll(field.getSubfields());
for (Subfield subfield : subfields) {
subfieldIds.add(subfield.getId());
}
return this; return this;
} }
public Builder setControl(boolean isControl) { public Builder setValidator(MarcFieldValidator validator) {
this.isControl = isControl; this.validator = validator;
return this; return this;
} }
/** /**
* Is the MARC field a control field? * Is the MARC field a control field?
*
* @return true if control field, false if not * @return true if control field, false if not
*/ */
public boolean isControl() { public boolean isControl() {
@ -678,8 +569,7 @@ public class MarcField implements Comparable<MarcField> {
* @return the built MARC field. * @return the built MARC field.
*/ */
public MarcField build() { public MarcField build() {
return new MarcField(tag, indicator, position, length, return new MarcField(this);
value, subfields, subfieldIds.toString(), isControl());
} }
@Override @Override
@ -693,24 +583,12 @@ public class MarcField implements Comparable<MarcField> {
*/ */
public static class Subfield { public static class Subfield {
private String id; private final String id;
private final String value; private final String value;
private Subfield(String id, String value) { private Subfield(String id, String value) {
if (id != null) { this.id = id;
// We have inconsistent use of subfield id symbols as placeholders for a "blank space"
// and we need to fix it here for consistency.
this.id = id
.replace('-', UNDERSCORE)
.replace('#', UNDERSCORE)
.replace('.', UNDERSCORE)
.replace(' ', UNDERSCORE);
}
// we do not allow an empty subfield id. Elasticsearch field names require a length > 0.
if (this.id != null && this.id.isEmpty()) {
this.id = UNDERSCORE_STRING;
}
this.value = value; this.value = value;
} }
@ -735,43 +613,4 @@ public class MarcField implements Comparable<MarcField> {
return id + "=" + value; return id + "=" + value;
} }
} }
@SuppressWarnings("serial")
private static class SubfieldIds extends LinkedList<String> {
/**
* Insertion sort. This is considered faster than sorting afterwards,
* especially for short lists (we have << 10 subfields at average in a field).
* @param string the string to insert
* @return true if collection changed
*/
@Override
public boolean add(String string) {
ListIterator<String> it = listIterator();
boolean added = false;
while (it.hasNext()) {
if (it.next().compareTo(string) > 0) {
it.previous();
it.add(string);
added = true;
break;
}
}
if (!added) {
it.add(string);
}
return true;
}
@Override
public String toString() {
// comma-less appearance
StringBuilder sb = new StringBuilder();
for (String s : this) {
sb.append(s);
}
return sb.toString();
}
}
} }

View file

@ -1,18 +1,17 @@
/* /**
Copyright 2016 Jörg Prante * Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
You may obtain a copy of the License at * You may obtain a copy of the License at
*
http://www.apache.org/licenses/LICENSE-2.0 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
limitations under the License. * limitations under the License.
*/ */
package org.xbib.marc; package org.xbib.marc;

View file

@ -21,9 +21,6 @@ import org.xbib.marc.label.RecordLabel;
import java.io.IOException; import java.io.IOException;
import java.util.TreeMap; import java.util.TreeMap;
/**
*
*/
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class MarcFieldDirectory extends TreeMap<Integer, MarcField.Builder> { public class MarcFieldDirectory extends TreeMap<Integer, MarcField.Builder> {

View file

@ -0,0 +1,31 @@
/**
* Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbib.marc;
public interface MarcFieldValidator {
String validateTag(String tag);
String validateIndicator(String indicator);
String validateSubfieldId(String subfieldId);
boolean isTagValid(String tag);
boolean isIndicatorValid(String indicator);
boolean isSubfieldIdValid(String subfieldId);
}

View file

@ -1,18 +1,17 @@
/* /**
Copyright 2016 Jörg Prante * Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
You may obtain a copy of the License at * You may obtain a copy of the License at
*
http://www.apache.org/licenses/LICENSE-2.0 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
limitations under the License. * limitations under the License.
*/ */
package org.xbib.marc; package org.xbib.marc;
@ -67,7 +66,7 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference> {
private MarcField.Builder builder; private MarcField.Builder builder;
private List<MarcField> marcFieldList; private final List<MarcField> marcFieldList;
public MarcGenerator() { public MarcGenerator() {
this.builder = MarcField.builder(); this.builder = MarcField.builder();
@ -75,6 +74,11 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference> {
this.marcFieldList = new LinkedList<>(); this.marcFieldList = new LinkedList<>();
} }
public MarcGenerator setValidator(MarcFieldValidator validator) {
this.builder.setValidator(validator);
return this;
}
public MarcGenerator setFormat(String format) { public MarcGenerator setFormat(String format) {
if (format != null) { if (format != null) {
this.format = format; this.format = format;
@ -265,7 +269,7 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference> {
} }
if (data.length() > RecordLabel.LENGTH) { if (data.length() > RecordLabel.LENGTH) {
// record label + record content = old directory-based format // record label + record content = old directory-based format
this.recordLabel = RecordLabel.builder().from(this.data.substring(0, RecordLabel.LENGTH).toCharArray()).build(); recordLabel = RecordLabel.builder().from(this.data.substring(0, RecordLabel.LENGTH).toCharArray()).build();
if (recordLabelFixer != null) { if (recordLabelFixer != null) {
this.recordLabel = recordLabelFixer.fix(recordLabel); this.recordLabel = recordLabelFixer.fix(recordLabel);
} }
@ -273,18 +277,17 @@ public class MarcGenerator implements ChunkListener<byte[], BytesReference> {
marcListener.beginRecord(format, type); marcListener.beginRecord(format, type);
marcListener.leader(recordLabel.toString()); marcListener.leader(recordLabel.toString());
} }
// create directory directory = new MarcFieldDirectory(recordLabel, this.data);
this.directory = new MarcFieldDirectory(recordLabel, this.data);
if (directory.isEmpty()) { if (directory.isEmpty()) {
builder.field(format, type, recordLabel, data.substring(RecordLabel.LENGTH)); builder.field(format, type, recordLabel, data.substring(RecordLabel.LENGTH));
} }
} else if (this.data.length() == RecordLabel.LENGTH) { } else if (this.data.length() == RecordLabel.LENGTH) {
this.recordLabel = RecordLabel.builder().from(this.data.substring(0, RecordLabel.LENGTH).toCharArray()).build(); recordLabel = RecordLabel.builder().from(this.data.substring(0, RecordLabel.LENGTH).toCharArray()).build();
if (recordLabelFixer != null) { if (recordLabelFixer != null) {
this.recordLabel = recordLabelFixer.fix(recordLabel); this.recordLabel = recordLabelFixer.fix(recordLabel);
} }
// record label only = new format without directory // record label only = new format without directory
this.directory = new MarcFieldDirectory(recordLabel, this.data); directory = new MarcFieldDirectory(recordLabel, this.data);
if (directory.isEmpty()) { if (directory.isEmpty()) {
if (marcListener != null) { if (marcListener != null) {
marcListener.beginRecord(format, type); marcListener.beginRecord(format, type);

View file

@ -1,18 +1,17 @@
/* /**
Copyright 2016 Jörg Prante * Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
You may obtain a copy of the License at * You may obtain a copy of the License at
*
http://www.apache.org/licenses/LICENSE-2.0 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
limitations under the License. * limitations under the License.
*/ */
package org.xbib.marc; package org.xbib.marc;
@ -36,7 +35,7 @@ import java.util.stream.Collectors;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class MarcRecord extends LinkedHashMap<String, Object> { public class MarcRecord extends LinkedHashMap<String, Object> {
private static final MarcRecord EMPTY = Marc.builder().buildRecord(); private static final MarcRecord EMPTY_RECORD = Marc.builder().buildRecord();
private final String format; private final String format;
@ -78,7 +77,7 @@ public class MarcRecord extends LinkedHashMap<String, Object> {
* @return empty MARC record * @return empty MARC record
*/ */
public static MarcRecord emptyRecord() { public static MarcRecord emptyRecord() {
return EMPTY; return EMPTY_RECORD;
} }
/** /**

View file

@ -0,0 +1,37 @@
package org.xbib.marc;
public class PermissiveMarcFieldValidator implements MarcFieldValidator {
public PermissiveMarcFieldValidator() {
}
@Override
public String validateTag(String tagCandidate) {
return tagCandidate;
}
@Override
public String validateIndicator(String indicatorCandidate) {
return indicatorCandidate;
}
@Override
public String validateSubfieldId(String subfieldIdCandidate) {
return subfieldIdCandidate;
}
@Override
public boolean isTagValid(String tag) {
return true;
}
@Override
public boolean isIndicatorValid(String indicator) {
return true;
}
@Override
public boolean isSubfieldIdValid(String subfieldId) {
return true;
}
}

View file

@ -0,0 +1,137 @@
/**
* Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbib.marc;
import java.util.Set;
public class StrictMarcFieldValidator implements MarcFieldValidator {
private static final Set<Character> ASCII_GRAPHICS = Set.of(
'\u0020', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\'',
'\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'\u003A', '\u003B', '\u003C', '\u003D', '\u003E', '\u003F', '\u0040',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z',
'\u005B', '\\', '\u005D', '\u005E', '\u005F', '\u0060',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z',
'\u007B', '\u007C', '\u007D', '\u007E'
);
private static final char BLANK = ' ';
private static final String BLANK_STRING = " ";
private static final String BLANK_TAG = " ";
public StrictMarcFieldValidator() {
}
@Override
public String validateTag(String tagCandidate) {
String tag = tagCandidate;
if (tag != null) {
// We have inconsistent use of tag symbols as placeholders for a "blank space"
// and we need to fix it here for consistency.
tag = tag.replace('-', BLANK)
.replace('#', BLANK)
.replace('.', BLANK)
.replace('_', BLANK);
// do not allow empty tags
if (tag.isEmpty()) {
tag = BLANK_TAG;
}
}
return tag;
}
@Override
public String validateIndicator(String indicatorCandidate) {
String indicator = indicatorCandidate;
if (indicator != null) {
// We have inconsistent use of indicator symbols as placeholders for a "blank space"
// and we need to fix it here for consistency.
indicator = indicator
.replace('-', BLANK)
.replace('#', BLANK)
.replace('.', BLANK)
.replace('_', BLANK);
// we do not allow an empty indicator. Elasticsearch field names require a length > 0.
if (indicator.isEmpty()) {
indicator = BLANK_STRING;
}
}
return indicator;
}
@Override
public String validateSubfieldId(String subfieldIdCandidate) {
String id = subfieldIdCandidate;
if (id != null) {
// We have inconsistent use of subfield id symbols as placeholders for a "blank space"
// and we need to fix it here for consistency.
id = id.replace('-', BLANK)
.replace('#', BLANK)
.replace('.', BLANK)
.replace('_', BLANK);
// we do not allow an empty subfield id. Elasticsearch field names require a length > 0.
if (id.isEmpty()) {
id = BLANK_STRING;
}
}
return id;
}
@Override
public boolean isTagValid(String tag) {
if (tag == null) {
// we allow no tag
return true;
}
// only tags of length 3 are supposed to be valid or an empty tag
return BLANK_TAG.equals(tag) || tag.length() == 3
&& ((tag.charAt(0) >= '0' && tag.charAt(0) <= '9')
|| (tag.charAt(0) >= 'A' && tag.charAt(0) <= 'Z'))
&& ((tag.charAt(1) >= '0' && tag.charAt(1) <= '9')
|| (tag.charAt(1) >= 'A' && tag.charAt(1) <= 'Z'))
&& ((tag.charAt(2) >= '0' && tag.charAt(2) <= '9')
|| (tag.charAt(2) >= 'A' && tag.charAt(2) <= 'Z'));
}
@Override
public boolean isIndicatorValid(String indicator) {
boolean b = indicator.length() <= 9;
for (int i = 0; i < indicator.length(); i++) {
b = indicator.charAt(i) == ' '
|| (indicator.charAt(i) >= '0' && indicator.charAt(i) <= '9')
|| (indicator.charAt(i) >= 'a' && indicator.charAt(i) <= 'z')
|| (indicator.charAt(i) >= 'A' && indicator.charAt(i) <= 'Z')
|| indicator.charAt(i) == '@'; // must be valid, for PICA dialect
if (!b) {
break;
}
}
return b;
}
@Override
public boolean isSubfieldIdValid(String subfieldId) {
return ASCII_GRAPHICS.contains(subfieldId.charAt(0));
}
}

View file

@ -1,6 +1,5 @@
package org.xbib.marc.dialects.mab; package org.xbib.marc.dialects.mab;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
@ -8,13 +7,7 @@ import java.util.Map;
*/ */
public class MabSubfieldControl { public class MabSubfieldControl {
private static final Map<String, Integer> FIELDS = new HashMap<>(); private static final Map<String, Integer> FIELDS = Map.of("088", 2, "655", 2, "856", 2);
static {
// MARC-like fields with subfield structure
FIELDS.put("088", 2);
FIELDS.put("655", 2);
FIELDS.put("856", 2);
}
private MabSubfieldControl() { private MabSubfieldControl() {
} }

View file

@ -39,16 +39,25 @@ public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
// the repeat counter pattern, simple integer // the repeat counter pattern, simple integer
private static final Pattern REP = Pattern.compile("\\{r\\}"); private static final Pattern REP = Pattern.compile("\\{r\\}");
// the two-string numeric repeat counter pattern // the two-string numeric repeat counter pattern
private static final Pattern NREP = Pattern.compile("\\{n\\}"); private static final Pattern NREP = Pattern.compile("\\{n\\}");
private final boolean ignoreIndicator; private final boolean ignoreIndicator;
private final boolean ignoreSubfieldIds; private final boolean ignoreSubfieldIds;
private transient MarcField lastReceived; private transient MarcField lastReceived;
private transient MarcField lastBuilt; private transient MarcField lastBuilt;
private int repeatCounter; private int repeatCounter;
private final Operator operator; private final Operator operator;
private MarcFieldTransformer(Map<String, MarcField> map, boolean ignoreIndicator, boolean ignoreSubfieldIds, private MarcFieldTransformer(Map<String, MarcField> map,
boolean ignoreIndicator,
boolean ignoreSubfieldIds,
Operator operator) { Operator operator) {
super(map); super(map);
this.ignoreIndicator = ignoreIndicator; this.ignoreIndicator = ignoreIndicator;
@ -78,6 +87,7 @@ public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
public String getTransformKey(MarcField marcField) { public String getTransformKey(MarcField marcField) {
String key = ignoreIndicator ? marcField.toTagKey() : ignoreSubfieldIds ? String key = ignoreIndicator ? marcField.toTagKey() : ignoreSubfieldIds ?
marcField.toTagIndicatorKey() : marcField.toKey(); marcField.toTagIndicatorKey() : marcField.toKey();
logger.log(Level.INFO, "the transform key is " + key);
return containsKey(key) ? key : null; return containsKey(key) ? key : null;
} }
@ -104,6 +114,7 @@ public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
} }
public MarcField head(MarcField marcField, String key) { public MarcField head(MarcField marcField, String key) {
logger.log(Level.INFO, "marcfield = " + marcField + " key = " + key);
if (key == null) { if (key == null) {
return marcField; return marcField;
} }
@ -279,33 +290,51 @@ public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
if (a == null) { if (a == null) {
return this; return this;
} }
String[] from = a.split(Pattern.quote(MarcField.KEY_DELIMITER), -1); String[] from = a.split(Pattern.quote(MarcField.DELIMITER), -1);
MarcField.Builder fromBuilder = MarcField.builder(); MarcField.Builder fromBuilder = MarcField.builder();
switch (from.length) { switch (from.length) {
case 1: case 1:
fromBuilder.tag(from[0]); fromBuilder.tag(from[0]);
break; break;
case 2: case 2:
fromBuilder.tag(from[0]).indicator(from[1]); fromBuilder.tag(from[0]);
if (!from[1].isEmpty()) {
fromBuilder.indicator(from[1]);
}
break; break;
case 3: case 3:
fromBuilder.tag(from[0]).indicator(from[1]).subfields(from[2]); fromBuilder.tag(from[0]);
if (!from[1].isEmpty()) {
fromBuilder.indicator(from[1]);
}
if (!from[2].isEmpty()) {
fromBuilder.subfields(from[2]);
}
break; break;
default: default:
break; break;
} }
if (b != null) { if (b != null) {
String[] to = b.split(Pattern.quote(MarcField.KEY_DELIMITER), -1); String[] to = b.split(Pattern.quote(MarcField.DELIMITER), -1);
MarcField.Builder toBuilder = MarcField.builder(); MarcField.Builder toBuilder = MarcField.builder();
switch (to.length) { switch (to.length) {
case 1: case 1:
toBuilder.tag(to[0]); toBuilder.tag(to[0]);
break; break;
case 2: case 2:
toBuilder.tag(to[0]).indicator(to[1]); toBuilder.tag(to[0]);
if (!to[1].isEmpty()) {
toBuilder.indicator(to[1]);
}
break; break;
case 3: case 3:
toBuilder.tag(to[0]).indicator(to[1]).subfields(to[2]); toBuilder.tag(to[0]);
if (!to[1].isEmpty()) {
toBuilder.indicator(to[1]);
}
if (!to[2].isEmpty()) {
toBuilder.subfields(to[2]);
}
break; break;
default: default:
break; break;
@ -323,7 +352,7 @@ public class MarcFieldTransformer extends LinkedHashMap<String, MarcField> {
} }
public Builder drop(String drop) { public Builder drop(String drop) {
String[] s = drop.split(Pattern.quote(MarcField.KEY_DELIMITER), -1); String[] s = drop.split(Pattern.quote(MarcField.DELIMITER), -1);
MarcField.Builder builder = MarcField.builder(); MarcField.Builder builder = MarcField.builder();
switch (s.length) { switch (s.length) {
case 1: case 1:

View file

@ -1,3 +1,18 @@
/**
* Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbib.marc; package org.xbib.marc;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
@ -7,9 +22,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import java.util.TreeSet; import java.util.TreeSet;
/**
*
*/
public class MarcFieldTest { public class MarcFieldTest {
@Test @Test
@ -93,7 +105,7 @@ public class MarcFieldTest {
} }
@Test @Test
public void testEmptyIndicatorWithSubfields() { public void testNoIndicatorWithSubfields() {
MarcField marcField = MarcField.builder() MarcField marcField = MarcField.builder()
.tag("016") .tag("016")
.subfield("1", null) .subfield("1", null)
@ -114,18 +126,48 @@ public class MarcFieldTest {
.build(); .build();
assertTrue(marcField.isTagValid()); assertTrue(marcField.isTagValid());
assertTrue(marcField.isIndicatorValid()); assertTrue(marcField.isIndicatorValid());
assertTrue(marcField.isSubfieldValid()); assertTrue(marcField.areAllSubfieldsValid());
} }
@Test @Test
public void testInvalidTag() { public void testEmptySubfield() {
MarcField marcField = MarcField.builder() MarcField marcField = MarcField.builder()
.tag("---") .tag("100")
.subfield("") // should be converted to a blank subfield ID by default
.build();
assertTrue(marcField.areAllSubfieldsValid());
assertTrue(marcField.isValid());
}
@Test
public void testEmptyIndicator() {
MarcField marcField = MarcField.builder()
.tag("100")
.indicator("") // should be converted to a blank indicator by default
.build();
assertTrue(marcField.isIndicatorValid());
assertTrue(marcField.isValid());
}
@Test
public void testEmptyTag() {
MarcField marcField = MarcField.builder()
.tag("") // should be converted to a blank tag by default
.build();
assertEquals(" ", marcField.getTag());
assertTrue(marcField.isTagValid());
assertTrue(marcField.isValid());
}
@Test
public void testInvalidTagConversion() {
MarcField marcField = MarcField.builder()
.tag("---") // dashes are converted to blanks by default
.subfield("1", null) .subfield("1", null)
.subfield("2", null) .subfield("2", null)
.subfield("3", null) .subfield("3", null)
.build(); .build();
assertFalse(marcField.isTagValid()); assertTrue(marcField.isTagValid());
} }
@Test @Test
@ -147,7 +189,7 @@ public class MarcFieldTest {
.indicator("0") .indicator("0")
.subfield("\u007f", null) .subfield("\u007f", null)
.build(); .build();
assertFalse(marcField.isSubfieldValid()); assertFalse(marcField.areAllSubfieldsValid());
} }
// 901 =, 901 a=98502599, 901 d=0, 901 e=14, 901 =f, 901 =h] // 901 =, 901 a=98502599, 901 d=0, 901 e=14, 901 =f, 901 =h]
@ -160,7 +202,7 @@ public class MarcFieldTest {
.subfield("d", null) .subfield("d", null)
.subfield("e", null) .subfield("e", null)
.build(); .build();
assertEquals("901$__$ade", marcField.toKey()); assertEquals("901$ $ade", marcField.toKey());
} }
@Test @Test
@ -180,7 +222,7 @@ public class MarcFieldTest {
int h2 = m2.hashCode(); int h2 = m2.hashCode();
assertEquals(h1, h2); assertEquals(h1, h2);
int cmp = m1.compareTo(m2); int cmp = m1.compareTo(m2);
assertTrue(cmp == 0); assertEquals(0, cmp);
m1 = MarcField.builder().tag("001").indicator(" ").subfield('a').build(); m1 = MarcField.builder().tag("001").indicator(" ").subfield('a').build();
m2 = MarcField.builder().tag("002").indicator(" ").subfield('a').build(); m2 = MarcField.builder().tag("002").indicator(" ").subfield('a').build();
cmp = m1.compareTo(m2); cmp = m1.compareTo(m2);

View file

@ -1,18 +1,15 @@
package org.xbib.marc; package org.xbib.marc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.IOException;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xbib.marc.label.RecordLabel; import org.xbib.marc.label.RecordLabel;
import org.xbib.marc.transformer.value.MarcValueTransformers; import org.xbib.marc.transformer.value.MarcValueTransformers;
import org.xbib.marc.xml.MarcXchangeWriter; import org.xbib.marc.xml.MarcXchangeWriter;
import org.xmlunit.matchers.CompareMatcher;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -20,9 +17,6 @@ import java.text.Normalizer;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/**
*
*/
public class MarcRecordTest { public class MarcRecordTest {
@Test @Test
@ -165,42 +159,33 @@ public class MarcRecordTest {
* Test MarcXchangeWriter as record listener. Result must be the same as with field listener. * Test MarcXchangeWriter as record listener. Result must be the same as with field listener.
*/ */
@Test @Test
public void testIRMARC8AsRecordStream() throws Exception { public void testIRMARC8AsRecordStream() throws IOException {
String s = "IRMARC8.bin"; StreamMatcher.xmlMatch(getClass(),"IRMARC8.bin", ".xml", (inputStream, outputStream) -> {
try (InputStream in = getClass().getResource(s).openStream()) {
File file = File.createTempFile(s + ".", ".xml");
file.deleteOnExit();
FileOutputStream out = new FileOutputStream(file);
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
try (MarcXchangeWriter writer = new MarcXchangeWriter(out) try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)
.setMarcValueTransformers(marcValueTransformers)) { .setMarcValueTransformers(marcValueTransformers)) {
Marc.builder() Marc.builder()
.setInputStream(in) .setInputStream(inputStream)
.setCharset(Charset.forName("ANSEL")) .setCharset(Charset.forName("ANSEL"))
.setMarcRecordListener(writer) .setMarcRecordListener(writer)
.build() .build()
.writeRecordCollection(); .writeRecordCollection();
assertNull(writer.getException()); assertNull(writer.getException());
} }
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream())); });
}
} }
@Test @Test
public void testIRMARC8AsLightweightRecordAdapter() throws Exception { public void testIRMARC8AsLightweightRecordAdapter() throws Exception {
String s = "IRMARC8.bin"; StreamMatcher.xmlMatch(getClass(),"IRMARC8.bin", ".xml", (inputStream, outputStream) -> {
try (InputStream in = getClass().getResource(s).openStream()) {
File file = File.createTempFile(s + ".", ".xml");
file.deleteOnExit();
FileOutputStream out = new FileOutputStream(file);
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
try (MarcXchangeWriter writer = new MarcXchangeWriter(out) try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)
.setMarcValueTransformers(marcValueTransformers)) { .setMarcValueTransformers(marcValueTransformers)) {
writer.startDocument(); // just write XML processing instruction writer.startDocument(); // just write XML processing instruction
Marc.builder() Marc.builder()
.setInputStream(in) .setInputStream(inputStream)
.setCharset(Charset.forName("ANSEL")) .setCharset(Charset.forName("ANSEL"))
.setMarcListener(new LightweightMarcRecordAdapter(writer)) .setMarcListener(new LightweightMarcRecordAdapter(writer))
.build() .build()
@ -208,7 +193,6 @@ public class MarcRecordTest {
assertNull(writer.getException()); assertNull(writer.getException());
writer.endDocument(); writer.endDocument();
} }
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream())); });
}
} }
} }

View file

@ -1,70 +1,41 @@
package org.xbib.marc; package org.xbib.marc;
import static org.hamcrest.MatcherAssert.assertThat;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xbib.marc.xml.MarcXchangeWriter; import org.xbib.marc.xml.MarcXchangeWriter;
import org.xmlunit.matchers.CompareMatcher;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
/** /**
* This test reads ISO 2709 MARC files, werits them to XML, parses XML and writes ISO 2709, * This test reads ISO 2709 MARC files, writes them to XML, parses the XML and writes back ISO 2709.
* and parses them to XML again for comparison.
*/ */
public class MarcRoundTripTest { public class MarcRoundTripTest {
@Test @Test
public void testProperMarc() throws Exception { public void testProperMarc() throws Exception {
for (String s : new String[]{ for (String s : new String[]{
"summerland.mrc", "summerland2.mrc",
"chabon.mrc", //"chabon.mrc",
"chabon-loc.mrc" //"chabon-loc.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.roundtrip(getClass(), s, ".xml",
File file = File.createTempFile(s + ".", ".xml"); (inputStream, outputStream) -> {
file.deleteOnExit(); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)) {
try (FileOutputStream out = new FileOutputStream(file); Marc.builder()
MarcXchangeWriter writer = new MarcXchangeWriter(out)) { .setInputStream(inputStream)
Marc.builder() .setCharset(Charset.forName("ANSEL"))
.setInputStream(in) .setMarcListener(writer)
.setCharset(Charset.forName("ANSEL")) .build()
.setMarcListener(writer) .writeCollection();
.build() }
.writeCollection(); }, (inputStream, outputStream) -> {
} try (MarcWriter writer = new MarcWriter(outputStream, StandardCharsets.UTF_8)) {
// parse XML and write ISO 2709 Marc.builder()
in = new FileInputStream(file); .setInputStream(inputStream)
File orig = File.createTempFile(s + ".", ".orig"); .setMarcListener(writer)
orig.deleteOnExit(); .build()
// we do not support ANSEL writing yet .xmlReader().parse();
try (FileOutputStream out = new FileOutputStream(orig); }
MarcWriter writer = new MarcWriter(out, StandardCharsets.UTF_8)) { });
Marc.builder()
.setInputStream(in)
.setMarcListener(writer)
.build()
.xmlReader().parse();
}
// parse ISO 2709 again and write XML
in = new FileInputStream(orig);
File file2 = File.createTempFile(s + ".", ".2.xml");
file2.deleteOnExit();
try (FileOutputStream out = new FileOutputStream(file2);
MarcXchangeWriter writer = new MarcXchangeWriter(out)) {
Marc.builder()
.setInputStream(in)
.setCharset(StandardCharsets.UTF_8)
.setMarcListener(writer)
.build()
.writeCollection();
}
// compare both to expected file structure
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
assertThat(file2, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
} }
} }

View file

@ -1,6 +1,20 @@
/**
* Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbib.marc; package org.xbib.marc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
@ -9,19 +23,12 @@ import org.xbib.marc.io.ReplaceStringInputStream;
import org.xbib.marc.transformer.value.MarcValueTransformers; import org.xbib.marc.transformer.value.MarcValueTransformers;
import org.xbib.marc.transformer.value.Xml10MarcValueCleaner; import org.xbib.marc.transformer.value.Xml10MarcValueCleaner;
import org.xbib.marc.xml.MarcXchangeWriter; import org.xbib.marc.xml.MarcXchangeWriter;
import org.xmlunit.matchers.CompareMatcher;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.text.Normalizer; import java.text.Normalizer;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/**
*
*/
public class MarcTest { public class MarcTest {
@Test @Test
@ -31,19 +38,16 @@ public class MarcTest {
"chabon.mrc", "chabon.mrc",
"chabon-loc.mrc" "chabon-loc.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)) {
file.deleteOnExit(); Marc.builder()
FileOutputStream out = new FileOutputStream(file); .setInputStream(inputStream)
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)) { .setCharset(Charset.forName("ANSEL"))
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(writer) }
.build() });
.writeCollection();
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
} }
@ -54,22 +58,19 @@ public class MarcTest {
"makrtest.mrc", "makrtest.mrc",
"brkrtest.mrc" "brkrtest.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
file.deleteOnExit(); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
FileOutputStream out = new FileOutputStream(file); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); .setMarcValueTransformers(marcValueTransformers)) {
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); Marc.builder()
try (MarcXchangeWriter writer = new MarcXchangeWriter(out) .setInputStream(inputStream)
.setMarcValueTransformers(marcValueTransformers)) { .setCharset(Charset.forName("ANSEL"))
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(writer) }
.build() });
.writeCollection();
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
} }
@ -86,42 +87,36 @@ public class MarcTest {
// result is invalid XML. Fix later. // result is invalid XML. Fix later.
//"bad-characters-in-various-fields.mrc" //"bad-characters-in-various-fields.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
file.deleteOnExit(); marcValueTransformers.setMarcValueTransformer(new Xml10MarcValueCleaner());
FileOutputStream out = new FileOutputStream(file); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream, true)
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); .setMarcValueTransformers(marcValueTransformers)) {
marcValueTransformers.setMarcValueTransformer(new Xml10MarcValueCleaner()); Marc.builder()
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true) .setInputStream(inputStream)
.setMarcValueTransformers(marcValueTransformers)) { .setCharset(Charset.forName("ANSEL"))
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(writer) }
.build() });
.writeCollection();
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
} }
@Test @Test
public void testAMS() throws Exception { public void testAMS() throws Exception {
String s = "amstransactions.mrc"; String s = "amstransactions.mrc";
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)) {
file.deleteOnExit(); Marc.builder()
FileOutputStream out = new FileOutputStream(file); .setInputStream(inputStream)
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)) { .setCharset(StandardCharsets.UTF_8)
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(StandardCharsets.UTF_8) .writeCollection();
.setMarcListener(writer) assertNull(writer.getException());
.build() }
.writeCollection(); });
assertNull(writer.getException());
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
/** /**
@ -130,38 +125,35 @@ public class MarcTest {
@Test @Test
public void testIRMARC8() throws Exception { public void testIRMARC8() throws Exception {
String s = "IRMARC8.bin"; String s = "IRMARC8.bin";
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
file.deleteOnExit(); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
FileOutputStream out = new FileOutputStream(file); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); .setMarcValueTransformers(marcValueTransformers)) {
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); Marc.builder()
try (MarcXchangeWriter writer = new MarcXchangeWriter(out) .setInputStream(inputStream)
.setMarcValueTransformers(marcValueTransformers)) { .setCharset(Charset.forName("ANSEL"))
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(writer) assertNull(writer.getException());
.build() assertEquals(10, writer.getRecordCounter());
.writeCollection(); }
assertNull(writer.getException()); });
assertEquals(10, writer.getRecordCounter());
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
@Test @Test
public void testRecordStream() throws Exception { public void testRecordStream() throws Exception {
String s = "IRMARC8.bin"; String s = "IRMARC8.bin";
InputStream in = getClass().getResource(s).openStream(); try (InputStream inputStream = getClass().getResource(s).openStream()) {
Marc.Builder builder = Marc.builder() Marc.Builder builder = Marc.builder()
.setInputStream(in) .setInputStream(inputStream)
.setCharset(StandardCharsets.UTF_8); .setCharset(StandardCharsets.UTF_8);
List<String> recordIDs = builder.recordStream().map(r -> r.get("001").toString()).collect(Collectors.toList()); List<String> recordIDs = builder.recordStream().map(r -> r.get("001").toString()).toList();
in.close(); assertEquals("[{1=ocn132792681}, {1=ocn132786677}, {1=ocn125170297}, {1=ocn137607921}, {1=ocn124081299}, "
assertEquals("[{1=ocn132792681}, {1=ocn132786677}, {1=ocn125170297}, {1=ocn137607921}, {1=ocn124081299}, " + "{1=ocn135450843}, {1=ocn137458539}, {1=ocn124411460}, {1=ocn131225106}, {1=ocn124450154}]",
+ "{1=ocn135450843}, {1=ocn137458539}, {1=ocn124411460}, {1=ocn131225106}, {1=ocn124450154}]", recordIDs.toString());
recordIDs.toString()); }
} }
/** /**
@ -174,25 +166,23 @@ public class MarcTest {
for (String s : new String[]{ for (String s : new String[]{
"cyrillic_capital_e.mrc" "cyrillic_capital_e.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
// repair file by replacing \u001f after escape sequence for cyrillic // repair file by replacing \u001f after escape sequence for cyrillic
ReplaceStringInputStream rin = new ReplaceStringInputStream(in, "\u001b(N\u001f", "\u001b(N|"); ReplaceStringInputStream replaceStringInputStream =
File file = File.createTempFile(s + ".", ".xml"); new ReplaceStringInputStream(inputStream, "\u001b(N\u001f", "\u001b(N|");
file.deleteOnExit(); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
FileOutputStream out = new FileOutputStream(file); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream, true)
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); .setMarcValueTransformers(marcValueTransformers)) {
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true) Marc.builder()
.setMarcValueTransformers(marcValueTransformers)) { .setInputStream(replaceStringInputStream)
Marc.builder() .setCharset(Charset.forName("ANSEL"))
.setInputStream(rin) .setMarcListener(writer)
.setCharset(Charset.forName("ANSEL")) .build()
.setMarcListener(writer) .writeCollection();
.build() assertNull(writer.getException());
.writeCollection(); }
assertNull(writer.getException()); });
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
} }
@ -201,20 +191,17 @@ public class MarcTest {
for (String s : new String[]{ for (String s : new String[]{
"oclc_63111280_export_as_UTF8_from_connexion.mrc" "oclc_63111280_export_as_UTF8_from_connexion.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)) {
file.deleteOnExit(); Marc.builder()
FileOutputStream out = new FileOutputStream(file); .setInputStream(inputStream)
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)) { .setCharset(StandardCharsets.UTF_8)
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(StandardCharsets.UTF_8) .writeCollection();
.setMarcListener(writer) assertNull(writer.getException());
.build() }
.writeCollection(); });
assertNull(writer.getException());
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
} }
@ -223,20 +210,17 @@ public class MarcTest {
for (String s : new String[]{ for (String s : new String[]{
"oclc_63111280_export_as_UTF8_from_connexion.mrc" "oclc_63111280_export_as_UTF8_from_connexion.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".indented.xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream, true)) {
file.deleteOnExit(); Marc.builder()
FileOutputStream out = new FileOutputStream(file); .setInputStream(inputStream)
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true)) { .setCharset(StandardCharsets.UTF_8)
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(StandardCharsets.UTF_8) .writeCollection();
.setMarcListener(writer) assertNull(writer.getException());
.build() }
.writeCollection(); });
assertNull(writer.getException());
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".indented.xml").openStream()));
} }
} }
@ -247,13 +231,14 @@ public class MarcTest {
@Test @Test
public void dumpMarc() throws Exception { public void dumpMarc() throws Exception {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
String s = "185258.mrc"; String s = "185258.mrc";
InputStream in = getClass().getResource(s).openStream(); try (InputStream inputStream = getClass().getResource(s).openStream()) {
Marc marc = Marc.builder() Marc marc = Marc.builder()
.setInputStream(in) .setInputStream(inputStream)
.setCharset(Charset.forName("ANSEL")) .setCharset(Charset.forName("ANSEL"))
.build(); .build();
marc.iso2709Stream().chunks().forEach(chunk -> sb.append(chunk.toString()).append("\n")); marc.iso2709Stream().chunks().forEach(chunk -> sb.append(chunk.toString()).append("\n"));
}
assertTrue(sb.length() > 0); assertTrue(sb.length() > 0);
} }
} }

View file

@ -25,9 +25,6 @@ import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamSource;
/**
*
*/
public class MarcToModsTest { public class MarcToModsTest {
@Test @Test

View file

@ -1,21 +1,27 @@
/**
* Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbib.marc; package org.xbib.marc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xbib.marc.transformer.value.MarcValueTransformers; import org.xbib.marc.transformer.value.MarcValueTransformers;
import org.xbib.marc.xml.MarcXchangeWriter; import org.xbib.marc.xml.MarcXchangeWriter;
import org.xmlunit.matchers.CompareMatcher;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
/**
*
*/
public class MarcWriterTest { public class MarcWriterTest {
@Test @Test
@ -25,32 +31,26 @@ public class MarcWriterTest {
"chabon.mrc", "chabon.mrc",
"chabon-loc.mrc" "chabon-loc.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".utf8", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".utf8"); try (MarcWriter writer = new MarcWriter(outputStream, StandardCharsets.UTF_8)) {
file.deleteOnExit(); Marc.builder()
FileOutputStream out = new FileOutputStream(file); .setInputStream(inputStream)
try (MarcWriter writer = new MarcWriter(out, StandardCharsets.UTF_8)) { .setCharset(Charset.forName("ANSEL"))
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(writer) assertNull(writer.getException());
.build() }
.writeCollection(); });
assertNull(writer.getException()); StreamMatcher.xmlMatch(getClass(), s + ".utf8", ".xml", (inputStream, outputStream) -> {
} try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)) {
// re-read files with our Marc builder and write as MarcXchange Marc.builder()
File xmlFile = File.createTempFile(s + ".", ".utf8"); .setInputStream(inputStream)
xmlFile.deleteOnExit(); .setMarcListener(writer)
out = new FileOutputStream(xmlFile); .build()
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)) { .writeCollection();
Marc.builder() }
.setInputStream(new FileInputStream(file)) });
.setMarcListener(writer)
.build()
.writeCollection();
}
// compare result
assertThat(xmlFile, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
} }
@ -61,38 +61,31 @@ public class MarcWriterTest {
"chabon.mrc", "chabon.mrc",
"chabon-loc.mrc" "chabon-loc.mrc"
}) { }) {
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".trans", (inputStream, outputStream) -> {
File file = File.createTempFile(s, ".utf8"); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
file.deleteOnExit(); marcValueTransformers.setMarcValueTransformer("245$10$a", t -> t.replaceAll("Chabon", "Chibon"));
FileOutputStream out = new FileOutputStream(file); try (MarcWriter writer = new MarcWriter(outputStream, StandardCharsets.UTF_8)
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); .setMarcValueTransformers(marcValueTransformers)) {
marcValueTransformers.setMarcValueTransformer("245$10$a", t -> t.replaceAll("Chabon", "Chibon")); Marc.builder()
try (MarcWriter writer = new MarcWriter(out, StandardCharsets.UTF_8) .setInputStream(inputStream)
.setMarcValueTransformers(marcValueTransformers)) { .setCharset(Charset.forName("ANSEL"))
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(writer) assertNull(writer.getException());
.build() }
.writeCollection(); });
assertNull(writer.getException()); StreamMatcher.xmlMatch(getClass(), s + ".trans", ".xml", (inputStream, outputStream) -> {
} MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
// re-read files with our Marc builder and write as MarcXchange marcValueTransformers.setMarcValueTransformer("245$10$a", t -> t.replaceAll("Chibon", "Chabon"));
File xmlFile = File.createTempFile(s, ".utf8"); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)) {
xmlFile.deleteOnExit(); Marc.builder()
out = new FileOutputStream(xmlFile); .setInputStream(inputStream)
marcValueTransformers = new MarcValueTransformers(); .setMarcListener(writer)
marcValueTransformers.setMarcValueTransformer("245$10$a", t -> t.replaceAll("Chibon", "Chabon")); .build()
try (MarcXchangeWriter writer = new MarcXchangeWriter(out) .writeCollection();
.setMarcValueTransformers(marcValueTransformers)) { }
Marc.builder() });
.setInputStream(new FileInputStream(file))
.setMarcListener(writer)
.build()
.writeCollection();
}
// compare result
assertThat(xmlFile, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
} }
} }

View file

@ -1,3 +1,18 @@
/**
* Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbib.marc; package org.xbib.marc;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
@ -13,22 +28,19 @@ import java.nio.charset.Charset;
import java.text.Normalizer; import java.text.Normalizer;
import java.util.zip.GZIPInputStream; import java.util.zip.GZIPInputStream;
/**
*
*/
public class MarcXchangeWriterTest { public class MarcXchangeWriterTest {
@Test @Test
public void splitMarcXchange() throws Exception { public void splitMarcXchange() throws Exception {
String s = "IRMARC8.bin"; String s = "IRMARC8.bin";
InputStream in = getClass().getResource("/org/xbib/marc//" + s).openStream(); InputStream inputStream = getClass().getResource("/org/xbib/marc//" + s).openStream();
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
// fileNamePattern, splitSize, bufferSize, compress, indent // fileNamePattern, splitSize, bufferSize, compress, indent
try (MarcXchangeWriter writer = new MarcXchangeWriter("build/%d.xml", 3, 65536, false, true) try (MarcXchangeWriter writer = new MarcXchangeWriter("build/%d.xml", 3, 65536, false, true)
.setMarcValueTransformers(marcValueTransformers)) { .setMarcValueTransformers(marcValueTransformers)) {
Marc.builder() Marc.builder()
.setInputStream(in) .setInputStream(inputStream)
.setCharset(Charset.forName("ANSEL")) .setCharset(Charset.forName("ANSEL"))
.setMarcListener(writer) .setMarcListener(writer)
.build() .build()
@ -49,14 +61,14 @@ public class MarcXchangeWriterTest {
@Test @Test
public void splitMarcXchangeCompressed() throws Exception { public void splitMarcXchangeCompressed() throws Exception {
String s = "IRMARC8.bin"; String s = "IRMARC8.bin";
InputStream in = getClass().getResource("/org/xbib/marc//" + s).openStream(); InputStream inputStream = getClass().getResource("/org/xbib/marc//" + s).openStream();
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
// fileNamePattern, splitSize, bufferSize, compress, indent // fileNamePattern, splitSize, bufferSize, compress, indent
try (MarcXchangeWriter writer = new MarcXchangeWriter("build/%d.xml.gz", 3, 65536, true, true) try (MarcXchangeWriter writer = new MarcXchangeWriter("build/%d.xml.gz", 3, 65536, true, true)
.setMarcValueTransformers(marcValueTransformers)) { .setMarcValueTransformers(marcValueTransformers)) {
Marc.builder() Marc.builder()
.setInputStream(in) .setInputStream(inputStream)
.setCharset(Charset.forName("ANSEL")) .setCharset(Charset.forName("ANSEL"))
.setMarcListener(writer) .setMarcListener(writer)
.build() .build()

View file

@ -1,35 +1,133 @@
/* /**
Copyright 2016 Jörg Prante * Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
You may obtain a copy of the License at * You may obtain a copy of the License at
*
http://www.apache.org/licenses/LICENSE-2.0 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
limitations under the License. * limitations under the License.
*/ */
package org.xbib.marc; package org.xbib.marc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assertions.fail;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.channels.Channels; import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel; import java.nio.channels.ReadableByteChannel;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.xmlunit.matchers.CompareMatcher;
/**
*
*/
public class StreamMatcher { public class StreamMatcher {
private static final Logger logger = Logger.getLogger(StreamMatcher.class.getName());
public interface Producer {
void produce(InputStream inputStream, OutputStream outputStream) throws IOException;
}
public static void xmlMatch(Class<?> cl, String resourceName, String suffix, Producer producer) throws IOException {
Path path = Files.createTempFile(resourceName, suffix);
try (InputStream inputStream = cl.getResource(resourceName).openStream();
OutputStream outputStream = Files.newOutputStream(path)) {
producer.produce(inputStream, outputStream);
} finally {
assertThat(path, CompareMatcher.isIdenticalTo(cl.getResource(resourceName + suffix).openStream()));
Files.delete(path);
}
}
public static void fileMatch(Class<?> cl, String resourceName, String suffix, Producer producer) throws IOException {
Path path = Files.createTempFile(resourceName, suffix);
logger.log(Level.INFO, "path = " + resourceName);
try (InputStream inputStream = cl.getResource(resourceName).openStream();
OutputStream outputStream = Files.newOutputStream(path)) {
producer.produce(inputStream, outputStream);
} finally {
logger.log(Level.INFO, "path = " + resourceName + suffix);
assertStream(resourceName, path, cl.getResource(resourceName + suffix).openStream());
Files.delete(path);
}
}
public static void roundtrip(Class<?> cl, String resourceName, String suffix,
Producer producer1, Producer producer2) throws IOException {
logger.log(Level.INFO, "original = " + new String(cl.getResource(resourceName).openStream().readAllBytes(), StandardCharsets.US_ASCII));
Path path1 = Files.createTempFile(resourceName, suffix);
Path path2 = Files.createTempFile(resourceName, suffix + ".orig");
try (InputStream inputStream1 = cl.getResource(resourceName).openStream();
OutputStream outputStream1 = Files.newOutputStream(path1)) {
producer1.produce(inputStream1, outputStream1);
logger.log(Level.INFO, "step 1: produced " + Files.readString(path1));
logger.log(Level.INFO, "step 1: asserting XML");
assertThat("step 1 " + path1, path1, CompareMatcher.isIdenticalTo(cl.getResource(resourceName + suffix).openStream()));
logger.log(Level.INFO, "step 1: success");
try (InputStream inputStream2 = Files.newInputStream(path1);
OutputStream outputStream2 = Files.newOutputStream(path2)) {
producer2.produce(inputStream2, outputStream2);
logger.log(Level.INFO, "step 2: produced " + Files.readString(path2));
logger.log(Level.INFO, "step 2: asserting");
assertStream("step 2 " + path2, path2, cl.getResource(resourceName).openStream());
logger.log(Level.INFO, "step 2: success");
} finally {
//Files.delete(path2);
}
} finally {
Files.delete(path1);
}
}
public static void compareTwoXmls(Class<?> cl, String resourceName,
String suffix1, Producer producer1,
String suffix2, Producer producer2) throws IOException {
Path path1 = Files.createTempFile(resourceName, suffix1);
Path path2 = Files.createTempFile(resourceName, suffix2);
try (InputStream inputStream1 = cl.getResource(resourceName).openStream();
OutputStream outputStream1 = Files.newOutputStream(path1);
InputStream inputStream2 = Files.newInputStream(path1);
OutputStream outputStream2 = Files.newOutputStream(path2)) {
producer1.produce(inputStream1, outputStream1);
producer2.produce(inputStream2, outputStream2);
//assertStream("comparing " + path1 + " and " + path2, path1, path2);
assertThat("XML check of " + path1, path1, CompareMatcher.isIdenticalTo(cl.getResource(resourceName + suffix1).openStream()));
assertThat("XML check of " + path2, path2, CompareMatcher.isIdenticalTo(cl.getResource(resourceName + suffix2).openStream()));
} finally {
Files.delete(path1);
Files.delete(path2);
}
}
public static void generate(Class<?> cl, String resourceName, String suffix, Producer producer) throws IOException {
Path path = Paths.get("src/test/resources", cl.getPackageName().replace('.', '/'), resourceName + suffix);
logger.log(Level.INFO, "path = " + path);
try (InputStream inputStream = cl.getResource(resourceName).openStream();
OutputStream outputStream = Files.newOutputStream(path)) {
producer.produce(inputStream, outputStream);
}
}
public static void assertStream(String name, Path path1, Path path2) throws IOException {
assertStream(name, Files.newInputStream(path1), Files.newInputStream(path2));
}
public static void assertStream(String name, Path path, InputStream expected) throws IOException {
assertStream(name, expected, Files.newInputStream(path));
}
public static void assertStream(String name, InputStream expected, String actual) throws IOException { public static void assertStream(String name, InputStream expected, String actual) throws IOException {
assertStream(name, expected, new ByteArrayInputStream(actual.getBytes(StandardCharsets.UTF_8))); assertStream(name, expected, new ByteArrayInputStream(actual.getBytes(StandardCharsets.UTF_8)));
} }

View file

@ -1,18 +1,30 @@
/**
* Copyright 2016-2022 Jörg Prante <joergprante@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License 2.0</a>
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbib.marc; package org.xbib.marc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.xbib.marc.StreamMatcher.assertStream; import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xbib.marc.json.MarcJsonWriter; import org.xbib.marc.json.MarcJsonWriter;
import org.xbib.marc.transformer.value.MarcValueTransformers; import org.xbib.marc.transformer.value.MarcValueTransformers;
import org.xbib.marc.xml.MarcXchangeWriter; import org.xbib.marc.xml.MarcXchangeWriter;
import org.xmlunit.matchers.CompareMatcher;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -22,45 +34,107 @@ import java.util.EnumSet;
public class ZDBTest { public class ZDBTest {
private final StringBuilder sb = new StringBuilder();
@Test @Test
public void testSRU() throws Exception { public void testSRU() throws Exception {
sb.setLength(0);
MarcListener listener = new Listener();
String s = "zdb-sru-marcxmlplus.xml"; String s = "zdb-sru-marcxmlplus.xml";
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".txt", (inputStream, outputStream) -> {
Marc marc = Marc.builder() try (Listener listener = new Listener(outputStream, StandardCharsets.UTF_8)) {
.setInputStream(in) Marc marc = Marc.builder()
.setCharset(StandardCharsets.UTF_8) .setInputStream(inputStream)
.setFormat("MARC21") .setCharset(StandardCharsets.UTF_8)
.setMarcListener(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE, listener) .setFormat("MARC21")
.setMarcListener(MarcXchangeConstants.HOLDINGS_TYPE, listener) .setMarcListener(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE, listener)
.build(); .setMarcListener(MarcXchangeConstants.HOLDINGS_TYPE, listener)
marc.xmlReader().parse(); .build();
assertStream(s, getClass().getResource("zdb-sru-marcxmlplus-keyvalue.txt").openStream(), marc.xmlReader().parse();
new ByteArrayInputStream(sb.toString().getBytes(StandardCharsets.UTF_8))); }
});
} }
@Test @Test
public void testOAI() throws Exception { public void testOAI() throws Exception {
sb.setLength(0);
MarcListener listener = new Listener();
String s = "zdb-oai-marc.xml"; String s = "zdb-oai-marc.xml";
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".txt", (inputStream, outputStream) -> {
Marc marc = Marc.builder() try (Listener listener = new Listener(outputStream, StandardCharsets.UTF_8)) {
.setInputStream(in) Marc marc = Marc.builder()
.setCharset(StandardCharsets.UTF_8) .setInputStream(inputStream)
.setFormat("MARC21") .setCharset(StandardCharsets.UTF_8)
.setMarcListener(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE, listener) .setFormat("MARC21")
.setMarcListener(MarcXchangeConstants.HOLDINGS_TYPE, listener) .setMarcListener(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE, listener)
.build(); .setMarcListener(MarcXchangeConstants.HOLDINGS_TYPE, listener)
marc.xmlReader().parse(); .build();
assertStream(s, getClass().getResource("zdb-oai-marc-keyvalue.txt").openStream(), marc.xmlReader().parse();
new ByteArrayInputStream(sb.toString().getBytes(StandardCharsets.UTF_8))); }
});
} }
private class Listener implements MarcListener { @Test
public void testZDBBib() throws Exception {
String s = "zdbtitutf8.mrc";
StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> {
MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
try (MarcJsonWriter writer = new MarcJsonWriter(outputStream, EnumSet.of(MarcJsonWriter.Style.LINES))
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
.setMarcValueTransformers(marcValueTransformers)) {
Marc.builder()
.setInputStream(inputStream)
.setMarcListener(writer)
.build()
.writeCollection();
assertNull(writer.getException());
}
});
}
@Test
public void testZDBStream() throws IOException {
String s = "zdblokutf8.mrc";
long count;
try (InputStream inputStream = getClass().getResource(s).openStream()) {
count = Marc.builder()
.setInputStream(inputStream)
.setCharset(StandardCharsets.UTF_8)
.build().iso2709Stream().chunks().count();
}
assertEquals(10170L, count);
try (InputStream inputStream = getClass().getResource(s).openStream()) {
Marc.builder()
.setInputStream(inputStream)
.setCharset(StandardCharsets.UTF_8)
.build().iso2709Stream().chunks()
.forEach(chunk -> assertTrue(chunk.data().length() >= 0));
}
}
@Test
public void testZDBLok() throws Exception {
String s = "zdblokutf8.mrc";
StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)
.setMarcValueTransformers(marcValueTransformers)) {
Marc.builder()
.setInputStream(inputStream)
.setCharset(StandardCharsets.UTF_8)
.setMarcListener(writer)
.build()
.writeCollection();
assertNull(writer.getException());
}
});
}
private static class Listener implements MarcListener, AutoCloseable {
private final BufferedWriter writer;
Listener(OutputStream outputStream, Charset charset) {
this.writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset));
}
@Override @Override
public void beginCollection() { public void beginCollection() {
} }
@ -71,93 +145,45 @@ public class ZDBTest {
@Override @Override
public void beginRecord(String format, String type) { public void beginRecord(String format, String type) {
sb.append("beginRecord").append("\n"); try {
sb.append("format=").append(format).append("\n"); writer.append("beginRecord").append("\n");
sb.append("type=").append(type).append("\n"); writer.append("format=").append(format).append("\n");
writer.append("type=").append(type).append("\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
@Override @Override
public void leader(String label) { public void leader(String label) {
sb.append("leader=").append(label).append("\n"); try {
writer.append("leader=").append(label).append("\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
@Override @Override
public void field(MarcField field) { public void field(MarcField field) {
sb.append(field).append("\n"); try {
writer.append(field.toString()).append("\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
@Override @Override
public void endRecord() { public void endRecord() {
sb.append("endRecord").append("\n"); try {
writer.append("endRecord").append("\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
} @Override
public void close() throws IOException {
/** writer.close();
* ZDB MARC Bibliographic.
*/
@Test
public void testZDBBib() throws Exception {
String s = "zdbtitutf8.mrc";
InputStream in = getClass().getResource(s).openStream();
File file = File.createTempFile(s, ".json");
file.deleteOnExit();
OutputStream out = new FileOutputStream(file);
MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
try (MarcJsonWriter writer = new MarcJsonWriter(out, EnumSet.of(MarcJsonWriter.Style.LINES))
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
.setMarcValueTransformers(marcValueTransformers)) {
Marc.builder()
.setInputStream(in)
.setMarcListener(writer)
.build()
.writeCollection();
assertNull(writer.getException());
} }
} }
@Test
public void testZDBStream() throws IOException {
String s = "zdblokutf8.mrc";
InputStream in = getClass().getResource(s).openStream();
long count = Marc.builder()
.setInputStream(in)
.setCharset(StandardCharsets.UTF_8)
.build().iso2709Stream().chunks().count();
in.close();
assertEquals(10170L, count);
in = getClass().getResource(s).openStream();
Marc.builder()
.setInputStream(in)
.setCharset(StandardCharsets.UTF_8)
.build().iso2709Stream().chunks()
.forEach(chunk -> assertTrue(chunk.data().length() >= 0));
in.close();
}
@Test
public void testZDBLok() throws Exception {
String s = "zdblokutf8.mrc";
InputStream in = getClass().getResource(s).openStream();
File file = File.createTempFile(s + ".", ".xml");
file.deleteOnExit();
FileOutputStream out = new FileOutputStream(file);
MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
try (MarcXchangeWriter writer = new MarcXchangeWriter(out)
.setMarcValueTransformers(marcValueTransformers)) {
Marc.builder()
.setInputStream(in)
.setCharset(StandardCharsets.UTF_8)
.setMarcListener(writer)
.build()
.writeCollection();
assertNull(writer.getException());
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
}
} }

View file

@ -5,10 +5,17 @@ import static org.junit.jupiter.api.Assertions.assertNull;
import static org.xbib.marc.StreamMatcher.assertStream; import static org.xbib.marc.StreamMatcher.assertStream;
import static org.xbib.marc.transformer.field.MarcFieldTransformer.Operator.HEAD; import static org.xbib.marc.transformer.field.MarcFieldTransformer.Operator.HEAD;
import static org.xbib.marc.transformer.field.MarcFieldTransformer.Operator.TAIL; import static org.xbib.marc.transformer.field.MarcFieldTransformer.Operator.TAIL;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xbib.marc.Marc; import org.xbib.marc.Marc;
import org.xbib.marc.MarcField; import org.xbib.marc.MarcField;
import org.xbib.marc.MarcListener; import org.xbib.marc.MarcListener;
import org.xbib.marc.StreamMatcher;
import org.xbib.marc.dialects.mab.xml.MabXMLContentHandler; import org.xbib.marc.dialects.mab.xml.MabXMLContentHandler;
import org.xbib.marc.label.RecordLabel; import org.xbib.marc.label.RecordLabel;
import org.xbib.marc.transformer.field.MarcFieldTransformer; import org.xbib.marc.transformer.field.MarcFieldTransformer;
@ -19,8 +26,6 @@ import org.xbib.marc.xml.MarcContentHandler;
import org.xbib.marc.xml.MarcXchangeWriter; import org.xbib.marc.xml.MarcXchangeWriter;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
import org.xmlunit.matchers.CompareMatcher; import org.xmlunit.matchers.CompareMatcher;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.io.StringWriter; import java.io.StringWriter;
import java.nio.charset.Charset; import java.nio.charset.Charset;
@ -29,33 +34,28 @@ import java.util.regex.Pattern;
public class MabTest { public class MabTest {
private final StringBuilder sb = new StringBuilder();
/** /**
* Shows how to override erraneous subfield ID length label settings, which is notorious to MAB dialect. * Shows how to override erraneous subfield ID length label settings, which is notorious to MAB dialect.
* @throws Exception if test faul * @throws Exception if test faul
*/ */
@Test @Test
public void testZDB() throws Exception { public void testOldZDBMab() throws Exception {
String s = "1217zdbtit.dat"; String s = "1217zdbtit.dat";
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream, true)
file.deleteOnExit();
FileOutputStream out = new FileOutputStream(file);
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true)
.setFormat("MAB")
.setType("Titel")
) {
Marc.builder()
.setFormat("MAB") .setFormat("MAB")
.setType("Titel") .setType("Titel")
.setInputStream(in) ) {
.setCharset(Charset.forName("x-MAB")) Marc.builder()
.setMarcListener("Titel", writer) .setFormat("MAB")
.build() .setType("Titel")
.writeCollection("Titel"); .setInputStream(inputStream)
} .setCharset(Charset.forName("x-MAB"))
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream())); .setMarcListener("Titel", writer)
.build()
.writeCollection("Titel");
}
});
} }
/** /**
@ -67,22 +67,21 @@ public class MabTest {
@Test @Test
public void testNLM22420274X() throws Exception { public void testNLM22420274X() throws Exception {
String s = "NLM22420274X.xml"; String s = "NLM22420274X.xml";
InputStream in = getClass().getResourceAsStream(s); StreamMatcher.fileMatch(getClass(), s, ".txt", (inputStream, outputStream) -> {
MarcListener listener = new Listener(); try (Listener listener = new Listener(outputStream, StandardCharsets.UTF_8)) {
MarcContentHandler contentHandler = new MabXMLContentHandler() MarcContentHandler contentHandler = new MabXMLContentHandler()
.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd") .addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd")
.setFormat("MabXML") .setFormat("MabXML")
.setType("h") .setType("h")
.setMarcListener(listener); .setMarcListener(listener);
Marc marc = Marc.builder() Marc marc = Marc.builder()
.setInputStream(in) .setInputStream(inputStream)
.setCharset(StandardCharsets.UTF_8) .setCharset(StandardCharsets.UTF_8)
.setContentHandler(contentHandler) .setContentHandler(contentHandler)
.build(); .build();
marc.xmlReader().parse(new InputSource(in)); marc.xmlReader().parse(new InputSource(inputStream));
in.close(); }
assertStream(s, getClass().getResource("NLM22420274X-keyvalue.txt").openStream(), });
sb.toString());
} }
/** /**
@ -91,61 +90,61 @@ public class MabTest {
@Test @Test
public void testAleph() throws Exception { public void testAleph() throws Exception {
String s = "HT016424175.xml"; String s = "HT016424175.xml";
InputStream in = getClass().getResourceAsStream(s); StreamMatcher.fileMatch(getClass(), s, ".txt", (inputStream, outputStream) -> {
MarcListener listener = new Listener(); try (Listener listener = new Listener(outputStream, StandardCharsets.UTF_8)) {
MarcContentHandler contentHandler = new MarcContentHandler(); MarcContentHandler contentHandler = new MarcContentHandler();
contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd"); contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
contentHandler.setFormat("MARC21"); contentHandler.setFormat("MARC21");
contentHandler.setType("Bibliographic"); contentHandler.setType("Bibliographic");
contentHandler.setMarcListener(listener); contentHandler.setMarcListener(listener);
Marc marc = Marc.builder() Marc marc = Marc.builder()
.setInputStream(in) .setInputStream(inputStream)
.setContentHandler(contentHandler) .setContentHandler(contentHandler)
.build(); .build();
marc.xmlReader().parse(new InputSource(in)); marc.xmlReader().parse(new InputSource(inputStream));
in.close(); }
assertStream(s, getClass().getResource("HT016424175-keyvalue.txt").openStream(), });
sb.toString());
} }
@Test @Test
public void testCombinedWriting() throws Exception { public void testCombinedWriting() throws Exception {
MarcListener listener = new Listener();
StringWriter sw = new StringWriter();
MarcXchangeWriter writer = new MarcXchangeWriter(sw);
writer.setFormat("AlephXML");
writer.setType("Bibliographic");
writer.setMarcListener(listener);
writer.beginCollection();
// write one record twice to test correct beginCollection/endCollection with two inner parse() calls
String s = "HT016424175.xml"; String s = "HT016424175.xml";
MarcContentHandler contentHandler = new MarcContentHandler(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd"); StringWriter sw = new StringWriter();
contentHandler.setFormat("MARC21"); try (Listener listener = new Listener(outputStream, StandardCharsets.UTF_8)) {
contentHandler.setType("Bibliographic"); MarcXchangeWriter writer = new MarcXchangeWriter(sw);
contentHandler.setMarcListener(writer); writer.setFormat("AlephXML");
try (InputStream in = getClass().getResourceAsStream(s)) { writer.setType("Bibliographic");
Marc marc = Marc.builder() writer.setMarcListener(listener);
.setInputStream(in) writer.beginCollection();
.setCharset(StandardCharsets.UTF_8) // write one record twice to test correct beginCollection/endCollection with two inner parse() calls
.setContentHandler(contentHandler) MarcContentHandler contentHandler = new MarcContentHandler();
.build(); contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
marc.xmlReader().parse(new InputSource(in)); contentHandler.setFormat("MARC21");
contentHandler.setType("Bibliographic");
contentHandler.setMarcListener(writer);
try (InputStream in = getClass().getResourceAsStream(s)) {
Marc marc = Marc.builder()
.setInputStream(in)
.setCharset(StandardCharsets.UTF_8)
.setContentHandler(contentHandler)
.build();
marc.xmlReader().parse(new InputSource(in));
}
try (InputStream inputStream = getClass().getResourceAsStream(s)) {
Marc marc = Marc.builder()
.setInputStream(inputStream)
.setCharset(StandardCharsets.UTF_8)
.setContentHandler(contentHandler)
.build();
marc.xmlReader().parse(new InputSource(inputStream));
}
writer.endCollection();
assertNull(writer.getException());
} }
try (InputStream in = getClass().getResourceAsStream(s)) {
Marc marc = Marc.builder()
.setInputStream(in)
.setCharset(StandardCharsets.UTF_8)
.setContentHandler(contentHandler)
.build();
marc.xmlReader().parse(new InputSource(in));
}
writer.endCollection();
sw.close(); sw.close();
assertNull(writer.getException()); assertStream(s, new ByteArrayInputStream(outputStream.toByteArray()),
assertStream(s, getClass().getResource("HT016424175.xml.combined.txt").openStream());
getClass().getResource("HT016424175-combined-keyvalue.txt").openStream(), sb.toString());
assertThat(sw.toString(), assertThat(sw.toString(),
CompareMatcher.isIdenticalTo(getClass().getResource("HT016424175-combined.xml").openStream())); CompareMatcher.isIdenticalTo(getClass().getResource("HT016424175-combined.xml").openStream()));
} }
@ -158,14 +157,11 @@ public class MabTest {
@Test @Test
public void testAlephMab() throws Exception { public void testAlephMab() throws Exception {
String s = "aleph-mab.mrc"; String s = "aleph-mab.mrc";
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream)
file.deleteOnExit(); .setFormat("MAB").setType("Bibliographic")) {
FileOutputStream out = new FileOutputStream(file); Marc.builder()
try (MarcXchangeWriter writer = new MarcXchangeWriter(out) .setInputStream(inputStream)
.setFormat("MAB").setType("Bibliographic")) {
Marc.builder()
.setInputStream(in)
.setCharset(StandardCharsets.UTF_8) .setCharset(StandardCharsets.UTF_8)
.setFormat("MAB") .setFormat("MAB")
.setType("Bibliographic") .setType("Bibliographic")
@ -192,113 +188,107 @@ public class MabTest {
}) })
.build() .build()
.writeCollection(); .writeCollection();
} }
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream())); });
} }
@Test @Test
public void testAlephMabWithFieldMapper() throws Exception { public void testAlephMabWithFieldMapper() throws Exception {
String s = "aleph-mab.mrc"; String s = "aleph-mab.mrc";
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".mapped.xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); MarcFieldTransformers transformers = new MarcFieldTransformers();
file.deleteOnExit(); MarcFieldTransformer t0 = MarcFieldTransformer.builder()
FileOutputStream out = new FileOutputStream(file); .ignoreSubfieldIds()
MarcFieldTransformers transformers = new MarcFieldTransformers(); .fromTo("902$ $ 9", "689$0{r}$a0")
MarcFieldTransformer t0 = MarcFieldTransformer.builder() .fromTo("902$ $ ", "689$0{r}$a")
.ignoreSubfieldIds() .operator(HEAD)
.fromTo("902$ $ 9", "689$0{r}$a0") .build();
.fromTo("902$ $ ", "689$0{r}$a") transformers.add(t0);
.operator(HEAD) try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream, true)
.build(); .setFormat("MAB").setType("Bibliographic")) {
transformers.add(t0); Marc.builder()
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true) .setInputStream(inputStream)
.setFormat("MAB").setType("Bibliographic")) { .setCharset(StandardCharsets.UTF_8)
Marc.builder() .setFormat("MAB")
.setInputStream(in) .setType("Bibliographic")
.setCharset(StandardCharsets.UTF_8) .setMarcListener(writer)
.setFormat("MAB") .setMarcFieldTransformers(transformers)
.setType("Bibliographic") .setRecordLabelFixer(recordLabel ->
.setMarcListener(writer) RecordLabel.builder().from(recordLabel).setSubfieldIdentifierLength(1).build())
.setMarcFieldTransformers(transformers) .setMarcTransformer((builder, label, data) -> {
.setRecordLabelFixer(recordLabel -> builder.tag(data.length() > 2 ? data.substring(0, 3) : null);
RecordLabel.builder().from(recordLabel).setSubfieldIdentifierLength(1).build()) if (builder.isControl()) {
.setMarcTransformer((builder, label, data) -> { // tricky: "Aleph MAB" control fields come with a blank indicator, cut it off here.
builder.tag(data.length() > 2 ? data.substring(0, 3) : null); if (data.length() > 4) {
if (builder.isControl()) { builder.value(data.substring(4));
// tricky: "Aleph MAB" control fields come with a blank indicator, cut it off here. }
if (data.length() > 4) { } else {
builder.value(data.substring(4)); int pos = 3 + label.getIndicatorLength();
builder.indicator(data.length() >= pos ? data.substring(3, pos) : null);
// tricky: "Aleph MAB" first subfield has no subfield ID! We set a blank ID.
// tag len 3 + ind len 1 = 4
String subfields = data.length() > 4 ? " " + data.substring(4) : "";
for (String value : subfields.split(Pattern.quote("$$"))) {
builder.subfield(value.substring(0, 1), value.substring(1));
}
} }
} else { })
int pos = 3 + label.getIndicatorLength(); .build()
builder.indicator(data.length() >= pos ? data.substring(3, pos) : null); .writeCollection();
// tricky: "Aleph MAB" first subfield has no subfield ID! We set a blank ID. }
// tag len 3 + ind len 1 = 4 });
String subfields = data.length() > 4 ? " " + data.substring(4) : "";
for (String value : subfields.split(Pattern.quote("$$"))) {
builder.subfield(value.substring(0, 1), value.substring(1));
}
}
})
.build()
.writeCollection();
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".mapped.xml").openStream()));
} }
@Test @Test
public void testAlephPublishSax() throws Exception { public void testAlephPublishSax() throws Exception {
String s = "DE-605-aleph-publish.xml"; String s = "DE-605-aleph-publish.xml";
InputStream in = getClass().getResource(s).openStream(); StreamMatcher.xmlMatch(getClass(), s, ".mapped.xml", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".xml"); MarcFieldTransformers transformers = new MarcFieldTransformers();
file.deleteOnExit(); MarcFieldTransformer t0 = MarcFieldTransformer.builder()
FileOutputStream out = new FileOutputStream(file); .ignoreSubfieldIds()
MarcFieldTransformers transformers = new MarcFieldTransformers(); .fromTo("902$ 1$9s", "689$0{r}$0s") // transform MAB to MARC21 subject numbering
MarcFieldTransformer t0 = MarcFieldTransformer.builder() .drop("903$ 1$a") // "Permutationsmuster" -> drop
.ignoreSubfieldIds() .operator(HEAD)
.fromTo("902$ 1$9s", "689$0{r}$0s") // transform MAB to MARC21 subject numbering
.drop("903$ 1$a") // "Permutationsmuster" -> drop
.operator(HEAD)
.build();
MarcFieldTransformer t1 = MarcFieldTransformer.builder()
// transform periodic fields of MAB "Gesamttitel" to MARC21 "Series added entry - uniform title"
.fromTo("451$ 1$a", "830$ 0$t")
// transform periodic fields of MAB "Gesamttitel" to MARC21 "Series added entry - uniform title"
.fromTo("461$ 1$a", "830$ 0$t")
.operator(HEAD)
.build();
MarcFieldTransformer t2 = MarcFieldTransformer.builder()
.fromTo("453$ 1$a", "830$ 0$w")
.fromTo("455$ 1$a", "830$ 0$v")
.fromTo("456$ 1$a", "830$ 0$n")
.fromTo("463$ 1$a", "830$ 0$w")
.fromTo("465$ 1$a", "830$ 0$v")
.fromTo("466$ 1$a", "830$ 0$n")
.operator(TAIL)
.build();
transformers.add(t0);
transformers.add(t1);
transformers.add(t2);
MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer("LOW$ 1$a", new LOWTransformer());
try (MarcXchangeWriter writer = new MarcXchangeWriter(out, true)) {
MarcContentHandler contentHandler = new MarcContentHandler();
contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
contentHandler.setMarcListener(writer);
Marc marc = Marc.builder()
.setInputStream(in)
.setCharset(StandardCharsets.UTF_8)
.setFormat("AlephXML")
.setType("Bibliographic")
.setContentHandler(contentHandler)
.setMarcFieldTransformers(transformers)
.setMarcValueTransformers(marcValueTransformers)
.build(); .build();
writer.beginCollection(); MarcFieldTransformer t1 = MarcFieldTransformer.builder()
marc.xmlReader().parse(new InputSource(in)); // transform periodic fields of MAB "Gesamttitel" to MARC21 "Series added entry - uniform title"
writer.endCollection(); .fromTo("451$ 1$a", "830$ 0$t")
} // transform periodic fields of MAB "Gesamttitel" to MARC21 "Series added entry - uniform title"
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + "-mapped.xml").openStream())); .fromTo("461$ 1$a", "830$ 0$t")
.operator(HEAD)
.build();
MarcFieldTransformer t2 = MarcFieldTransformer.builder()
.fromTo("453$ 1$a", "830$ 0$w")
.fromTo("455$ 1$a", "830$ 0$v")
.fromTo("456$ 1$a", "830$ 0$n")
.fromTo("463$ 1$a", "830$ 0$w")
.fromTo("465$ 1$a", "830$ 0$v")
.fromTo("466$ 1$a", "830$ 0$n")
.operator(TAIL)
.build();
transformers.add(t0);
transformers.add(t1);
transformers.add(t2);
MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer("LOW$ 1$a", new LOWTransformer());
try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream, true)) {
MarcContentHandler contentHandler = new MarcContentHandler();
contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
contentHandler.setMarcListener(writer);
Marc marc = Marc.builder()
.setInputStream(inputStream)
.setCharset(StandardCharsets.UTF_8)
.setFormat("AlephXML")
.setType("Bibliographic")
.setContentHandler(contentHandler)
.setMarcFieldTransformers(transformers)
.setMarcValueTransformers(marcValueTransformers)
.build();
writer.beginCollection();
marc.xmlReader().parse(new InputSource(inputStream));
writer.endCollection();
}
});
} }
private static class LOWTransformer implements MarcValueTransformer { private static class LOWTransformer implements MarcValueTransformer {
@ -309,7 +299,14 @@ public class MabTest {
} }
} }
private class Listener implements MarcListener { private static class Listener implements MarcListener, AutoCloseable {
private final BufferedWriter writer;
Listener(OutputStream outputStream, Charset charset) {
this.writer = new BufferedWriter(new OutputStreamWriter(outputStream, charset));
}
@Override @Override
public void beginCollection() { public void beginCollection() {
} }
@ -320,24 +317,46 @@ public class MabTest {
@Override @Override
public void beginRecord(String format, String type) { public void beginRecord(String format, String type) {
sb.append("beginRecord").append("\n"); try {
sb.append("format=").append(format).append("\n"); writer.append("beginRecord").append("\n");
sb.append("type=").append(type).append("\n"); writer.append("format=").append(format).append("\n");
writer.append("type=").append(type).append("\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
@Override @Override
public void leader(String label) { public void leader(String label) {
sb.append("leader=").append(label).append("\n"); try {
writer.append("leader=").append(label).append("\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
@Override @Override
public void field(MarcField field) { public void field(MarcField field) {
sb.append(field).append("\n"); try {
writer.append(field.toString()).append("\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
} }
@Override @Override
public void endRecord() { public void endRecord() {
sb.append("endRecord").append("\n"); try {
writer.append("endRecord").append("\n");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void close() throws IOException {
writer.close();
} }
} }
} }

View file

@ -1,19 +1,16 @@
package org.xbib.marc.dialects.mab; package org.xbib.marc.dialects.mab;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.xbib.marc.StreamMatcher.assertStream; import static org.xbib.marc.StreamMatcher.assertStream;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xbib.marc.Marc; import org.xbib.marc.Marc;
import org.xbib.marc.StreamMatcher;
import org.xbib.marc.dialects.mab.xml.MabXMLContentHandler; import org.xbib.marc.dialects.mab.xml.MabXMLContentHandler;
import org.xbib.marc.json.MarcJsonWriter; import org.xbib.marc.json.MarcJsonWriter;
import org.xbib.marc.xml.MarcContentHandler; import org.xbib.marc.xml.MarcContentHandler;
import org.xbib.marc.xml.MarcXchangeWriter; import org.xbib.marc.xml.MarcXchangeWriter;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
import org.xmlunit.matchers.CompareMatcher;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.EnumSet; import java.util.EnumSet;
@ -23,51 +20,46 @@ public class MabXmlTest {
@Test @Test
public void testMabXml2MarcXchangeExample() throws Exception { public void testMabXml2MarcXchangeExample() throws Exception {
String s = "mabxml-example.xml"; String s = "mabxml-example.xml";
File file = File.createTempFile(s + ".", ".xml"); StreamMatcher.xmlMatch(getClass(), s, ".xml", (inputStream, outputStream) -> {
file.deleteOnExit(); try (MarcXchangeWriter writer = new MarcXchangeWriter(outputStream, true)
FileOutputStream out = new FileOutputStream(file); .setFormat("MARC21")
try (InputStream in = getClass().getResourceAsStream(s); .setType("Bibliographic")) {
MarcXchangeWriter writer = new MarcXchangeWriter(out, true) writer.startDocument();
.setFormat("MARC21") writer.beginCollection();
.setType("Bibliographic")) { Marc.builder()
writer.startDocument(); .setInputStream(inputStream)
writer.beginCollection(); .setCharset(StandardCharsets.UTF_8)
Marc.builder() .setContentHandler(new MabXMLContentHandler()
.setInputStream(in) .addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd")
.setCharset(StandardCharsets.UTF_8) .setFormat("MabXML")
.setContentHandler(new MabXMLContentHandler() .setType("h")
.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd") .setMarcListener(writer))
.setFormat("MabXML") .build().xmlReader().parse(new InputSource(inputStream));
.setType("h") writer.endCollection();
.setMarcListener(writer)) writer.endDocument();
.build().xmlReader().parse(new InputSource(in)); }
writer.endCollection(); });
writer.endDocument();
}
assertThat(file, CompareMatcher.isIdenticalTo(getClass().getResource(s + ".xml").openStream()));
} }
@Test @Test
public void testMabXml2JsonExample() throws Exception { public void testMabXml2JsonExample() throws Exception {
String s = "mabxml-example.xml"; String s = "mabxml-example.xml";
ByteArrayOutputStream out = new ByteArrayOutputStream(); StreamMatcher.fileMatch(getClass(), s, ".jsonl", (inputStream, outputStream) -> {
try (InputStream in = getClass().getResourceAsStream(s); try (MarcJsonWriter writer = new MarcJsonWriter(outputStream,
MarcJsonWriter writer = new MarcJsonWriter(out, 10, EnumSet.of(MarcJsonWriter.Style.ELASTICSEARCH_BULK))
10, EnumSet.of(MarcJsonWriter.Style.ELASTICSEARCH_BULK)) .setIndex("testindex", "testtype")) {
.setIndex("testindex", "testtype")) { MarcContentHandler contentHandler = new MabXMLContentHandler()
MarcContentHandler contentHandler = new MabXMLContentHandler() .addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd")
.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd") .setFormat("MabXML")
.setFormat("MabXML") .setType("h")
.setType("h") .setMarcListener(writer);
.setMarcListener(writer); Marc marc = Marc.builder()
Marc marc = Marc.builder() .setInputStream(inputStream)
.setInputStream(in) .setCharset(StandardCharsets.UTF_8)
.setCharset(StandardCharsets.UTF_8) .setContentHandler(contentHandler)
.setContentHandler(contentHandler) .build();
.build(); marc.xmlReader().parse(new InputSource(inputStream));
marc.xmlReader().parse(new InputSource(in)); }
} });
assertStream(s, getClass().getResource(s + ".jsonl").openStream(),
new ByteArrayInputStream(out.toByteArray()));
} }
} }

View file

@ -5,15 +5,18 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.xbib.marc.StreamMatcher.assertStream; import static org.xbib.marc.StreamMatcher.assertStream;
import java.io.OutputStream;
import java.io.Writer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xbib.marc.Marc; import org.xbib.marc.Marc;
import org.xbib.marc.MarcRecordAdapter; import org.xbib.marc.MarcRecordAdapter;
import org.xbib.marc.MarcXchangeConstants; import org.xbib.marc.MarcXchangeConstants;
import org.xbib.marc.StreamMatcher;
import org.xbib.marc.transformer.value.MarcValueTransformers; import org.xbib.marc.transformer.value.MarcValueTransformers;
import org.xbib.marc.xml.MarcContentHandler; import org.xbib.marc.xml.MarcContentHandler;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.text.Normalizer; import java.text.Normalizer;
@ -22,7 +25,7 @@ import java.util.EnumSet;
public class MarcJsonWriterTest { public class MarcJsonWriterTest {
/** /**
* {@code }MarcJsonWriter} can receive MARC fields. * {@code MarcJsonWriter} can receive MARC fields.
* *
* @throws Exception if test fails * @throws Exception if test fails
*/ */
@ -33,28 +36,24 @@ public class MarcJsonWriterTest {
"chabon.mrc", "chabon.mrc",
"chabon-loc.mrc" "chabon-loc.mrc"
}) { }) {
InputStream in = getClass().getResource("/org/xbib/marc/" + s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".json"); try (MarcJsonWriter writer = new MarcJsonWriter(outputStream)
file.deleteOnExit(); .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
FileOutputStream out = new FileOutputStream(file); .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
try (MarcJsonWriter writer = new MarcJsonWriter(out) ) {
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) Marc.builder()
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) .setInputStream(inputStream)
) { .setCharset(Charset.forName("ANSEL"))
Marc.builder() .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(writer) }
.build() });
.writeCollection();
}
assertStream(s, getClass().getResource("/org/xbib/marc/json/" + s + ".json").openStream(),
new FileInputStream(file));
} }
} }
/** /**
* {@code }MarcJsonWriter} can receive MARC records. * {@code MarcJsonWriter} can receive MARC records.
* *
* @throws Exception if test fails * @throws Exception if test fails
*/ */
@ -65,23 +64,19 @@ public class MarcJsonWriterTest {
"chabon.mrc", "chabon.mrc",
"chabon-loc.mrc" "chabon-loc.mrc"
}) { }) {
InputStream in = getClass().getResource("/org/xbib/marc/" + s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".json"); try (MarcJsonWriter writer = new MarcJsonWriter(outputStream)
file.deleteOnExit(); ) {
FileOutputStream out = new FileOutputStream(file); Marc.builder()
try (MarcJsonWriter writer = new MarcJsonWriter(out) .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
) { .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
Marc.builder() .setInputStream(inputStream)
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) .setCharset(Charset.forName("ANSEL"))
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) .setMarcRecordListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeRecordCollection();
.setMarcRecordListener(writer) }
.build() });
.writeRecordCollection();
}
assertStream(s, getClass().getResource("/org/xbib/marc/json/" + s + ".json").openStream(),
new FileInputStream(file));
} }
} }
@ -98,55 +93,47 @@ public class MarcJsonWriterTest {
"chabon.mrc", "chabon.mrc",
"chabon-loc.mrc" "chabon-loc.mrc"
}) { }) {
InputStream in = getClass().getResource("/org/xbib/marc/" + s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".json"); try (MarcJsonWriter writer = new MarcJsonWriter(outputStream)) {
file.deleteOnExit(); Marc.builder()
FileOutputStream out = new FileOutputStream(file); .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
try (MarcJsonWriter writer = new MarcJsonWriter(out)) { .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
Marc.builder() .setInputStream(inputStream)
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) .setCharset(Charset.forName("ANSEL"))
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) .setMarcListener(new MarcRecordAdapter(writer))
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(new MarcRecordAdapter(writer)) }
.build() });
.writeCollection();
}
assertStream(s, getClass().getResource("/org/xbib/marc/json/" + s + ".json").openStream(),
new FileInputStream(file));
} }
} }
@Test @Test
public void testAlephPublishRecordAdapterJson() throws Exception { public void testAlephPublishRecordAdapterJson() throws Exception {
String s = "HT016424175.xml"; String s = "HT016424175.xml";
InputStream in = getClass().getResource("/org/xbib/marc/dialects/mab/" + s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".json"); try (MarcJsonWriter writer = new MarcJsonWriter(outputStream, EnumSet.of(MarcJsonWriter.Style.LINES))
file.deleteOnExit(); .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
FileOutputStream out = new FileOutputStream(file); .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
try (MarcJsonWriter writer = new MarcJsonWriter(out, EnumSet.of(MarcJsonWriter.Style.LINES)) ) {
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) MarcContentHandler contentHandler = new MarcContentHandler();
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd");
) { contentHandler.setFormat("MARC21");
MarcContentHandler contentHandler = new MarcContentHandler(); contentHandler.setType("Bibliographic");
contentHandler.addNamespace("http://www.ddb.de/professionell/mabxml/mabxml-1.xsd"); contentHandler.setMarcListener(new MarcRecordAdapter(writer));
contentHandler.setFormat("MARC21"); Marc.builder()
contentHandler.setType("Bibliographic"); .setInputStream(inputStream)
contentHandler.setMarcListener(new MarcRecordAdapter(writer)); .setContentHandler(contentHandler)
Marc.builder() .build()
.setInputStream(in) .xmlReader().parse();
.setContentHandler(contentHandler) }
.build() });
.xmlReader().parse();
}
assertStream(s, getClass().getResource("/org/xbib/marc/json/" + s + ".json").openStream(),
new FileInputStream(file));
} }
@Test @Test
public void splitMARC() throws Exception { public void splitMARC() throws Exception {
String s = "IRMARC8.bin"; String s = "IRMARC8.bin";
InputStream in = getClass().getResource("/org/xbib/marc//" + s).openStream(); InputStream in = getClass().getResource("/org/xbib/marc/" + s).openStream();
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
try (MarcJsonWriter writer = new MarcJsonWriter("build/%d.json", 3)) { try (MarcJsonWriter writer = new MarcJsonWriter("build/%d.json", 3)) {
@ -160,26 +147,26 @@ public class MarcJsonWriterTest {
assertEquals(10, writer.getRecordCounter()); assertEquals(10, writer.getRecordCounter());
assertNull(writer.getException()); assertNull(writer.getException());
} }
File f0 = new File("build/0.json"); Path f0 = Paths.get("build/0.json");
assertTrue(f0.exists()); assertTrue(Files.exists(f0));
assertEquals(6015, f0.length()); assertEquals(6015, Files.size(f0));
File f1 = new File("build/1.json"); Path f1 = Paths.get("build/1.json");
assertTrue(f1.exists()); assertTrue(Files.exists(f1));
assertEquals(7130, f1.length()); assertEquals(7130, Files.size(f1));
File f2 = new File("build/2.json"); Path f2 = Paths.get("build/2.json");
assertTrue(f2.exists()); assertTrue(Files.exists(f2));
assertEquals(6426, f2.length()); assertEquals(6426, Files.size(f2));
File f3 = new File("build/3.json"); Path f3 = Paths.get("build/3.json");
assertTrue(f3.exists()); assertTrue(Files.exists(f3));
assertEquals(2110, f3.length()); assertEquals(2110, Files.size(f3));
File f4 = new File("build/4.json"); Path f4 = Paths.get("build/4.json");
assertFalse(f4.exists()); assertFalse(Files.exists(f4));
} }
@Test @Test
public void elasticsearchBulkFormat() throws Exception { public void elasticsearchBulkFormat() throws Exception {
String s = "IRMARC8.bin"; String s = "IRMARC8.bin";
InputStream in = getClass().getResource("/org/xbib/marc//" + s).openStream(); InputStream in = getClass().getResource("/org/xbib/marc/" + s).openStream();
MarcValueTransformers marcValueTransformers = new MarcValueTransformers(); MarcValueTransformers marcValueTransformers = new MarcValueTransformers();
marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC)); marcValueTransformers.setMarcValueTransformer(value -> Normalizer.normalize(value, Normalizer.Form.NFC));
try (MarcJsonWriter writer = new MarcJsonWriter("build/bulk%d.jsonl", try (MarcJsonWriter writer = new MarcJsonWriter("build/bulk%d.jsonl",
@ -197,22 +184,29 @@ public class MarcJsonWriterTest {
assertNull(writer.getException()); assertNull(writer.getException());
assertEquals(10, writer.getRecordCounter()); assertEquals(10, writer.getRecordCounter());
} }
File f0 = new File("build/bulk0.jsonl"); Path f0 = Paths.get("build/bulk0.jsonl");
assertTrue(f0.exists()); assertTrue(Files.exists(f0));
assertEquals(6295, f0.length()); assertEquals(6295, Files.size(f0));
File f1 = new File("build/bulk1.jsonl"); Path f1 = Paths.get("build/bulk1.jsonl");
assertTrue(f1.exists()); assertTrue(Files.exists(f1));
assertEquals(7410, f1.length()); assertEquals(7410, Files.size(f1));
File f2 = new File("build/bulk2.jsonl"); Path f2 = Paths.get("build/bulk2.jsonl");
assertTrue(f2.exists()); assertTrue(Files.exists(f2));
assertEquals(6706, f2.length()); assertEquals(6706, Files.size(f2));
File f3 = new File("build/bulk3.jsonl"); Path f3 = Paths.get("build/bulk3.jsonl");
assertTrue(f3.exists()); assertTrue(Files.exists(f3));
assertEquals(2204, f3.length()); assertEquals(2204, Files.size(f3));
File f4 = new File("build/bulk4.jsonl"); Path f4 = Paths.get("build/bulk4.jsonl");
assertFalse(f4.exists()); assertFalse(Files.exists(f4));
} }
/**
* Ugly idea to check against gzipped file lengths!
*
* TODO: fix the test, gzip and gunzip, and check against clear text content.
*
* @throws Exception if test errors
*/
@Test @Test
public void elasticsearchBulkFormatCompressed() throws Exception { public void elasticsearchBulkFormatCompressed() throws Exception {
String s = "IRMARC8.bin"; String s = "IRMARC8.bin";
@ -234,20 +228,20 @@ public class MarcJsonWriterTest {
.writeCollection(); .writeCollection();
assertNull(writer.getException()); assertNull(writer.getException());
assertEquals(10, writer.getRecordCounter()); assertEquals(10, writer.getRecordCounter());
File f0 = new File("build/bulk0.jsonl.gz"); Path f0 = Paths.get("build/bulk0.jsonl.gz");
assertTrue(f0.exists()); assertTrue(Files.exists(f0));
assertEquals(2141, f0.length()); assertEquals(2142, Files.size(f0));
File f1 = new File("build/bulk1.jsonl.gz"); Path f1 = Paths.get("build/bulk1.jsonl.gz");
assertTrue(f1.exists()); assertTrue(Files.exists(f1));
assertEquals(2608, f1.length()); assertEquals(2608, Files.size(f1));
File f2 = new File("build/bulk2.jsonl.gz"); Path f2 = Paths.get("build/bulk2.jsonl.gz");
assertTrue(f2.exists()); assertTrue(Files.exists(f2));
assertEquals(2667, f2.length()); assertEquals(2666, Files.size(f2));
File f3 = new File("build/bulk3.jsonl.gz"); Path f3 = Paths.get("build/bulk3.jsonl.gz");
assertTrue(f3.exists()); assertTrue(Files.exists(f3));
assertEquals(1021, f3.length()); // but, it's 1031??? assertEquals(1020, Files.size(f3));
File f4 = new File("build/bulk4.jsonl.gz"); Path f4 = Paths.get("build/bulk4.jsonl.gz");
assertFalse(f4.exists()); assertFalse(Files.exists(f4));
} }
} }
@ -271,10 +265,9 @@ public class MarcJsonWriterTest {
@Test @Test
public void testJsonWriterWithMultipleInput() throws Exception { public void testJsonWriterWithMultipleInput() throws Exception {
File file = File.createTempFile("multi.", ".json"); Path path = Files.createTempFile("multi.", ".json");
file.deleteOnExit(); try (OutputStream outputStream = Files.newOutputStream(path);
FileOutputStream out = new FileOutputStream(file); MarcJsonWriter writer = new MarcJsonWriter(outputStream, EnumSet.of(MarcJsonWriter.Style.ARRAY))) {
try (MarcJsonWriter writer = new MarcJsonWriter(out, EnumSet.of(MarcJsonWriter.Style.ARRAY))) {
writer.beginCollection(); writer.beginCollection();
try (InputStream inputStream = getClass().getResource("/org/xbib/marc/summerland.mrc").openStream()) { try (InputStream inputStream = getClass().getResource("/org/xbib/marc/summerland.mrc").openStream()) {
Marc.builder() Marc.builder()
@ -298,9 +291,11 @@ public class MarcJsonWriterTest {
.writeRecords(); .writeRecords();
} }
writer.endCollection(); writer.endCollection();
assertStream("multi", Files.newInputStream(path),
getClass().getResource("/org/xbib/marc/json/multi.json").openStream());
} finally {
Files.delete(path);
} }
assertStream("multi", getClass().getResource("/org/xbib/marc/json/multi.json").openStream(),
new FileInputStream(file));
} }
/** /**
@ -313,23 +308,19 @@ public class MarcJsonWriterTest {
for (String s : new String[]{ for (String s : new String[]{
"rism_190101037.mrc" "rism_190101037.mrc"
}) { }) {
InputStream in = getClass().getResource("/org/xbib/marc/" + s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".json"); try (MarcJsonWriter writer = new MarcJsonWriter(outputStream)
file.deleteOnExit(); ) {
FileOutputStream out = new FileOutputStream(file); Marc.builder()
try (MarcJsonWriter writer = new MarcJsonWriter(out) .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
) { .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
Marc.builder() .setInputStream(inputStream)
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) .setCharset(Charset.forName("ANSEL"))
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) .setMarcRecordListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeRecordCollection();
.setMarcRecordListener(writer) }
.build() });
.writeRecordCollection();
}
assertStream(s, getClass().getResource("/org/xbib/marc/json/" + s + ".json").openStream(),
new FileInputStream(file));
} }
} }
@ -337,30 +328,26 @@ public class MarcJsonWriterTest {
* Test JSON format that allows duplicate keys. This allows to format MARC in order, * Test JSON format that allows duplicate keys. This allows to format MARC in order,
* as defined by cataloging rules. * as defined by cataloging rules.
* *
* @throws Exception if test fails * @throws Exception if test has an error
*/ */
@Test @Test
public void testMarcRecordJsonWithDuplicateKeys() throws Exception { public void testMarcRecordJsonWithDuplicateKeys() throws Exception {
for (String s : new String[]{ for (String s : new String[]{
"test_ubl.mrc" "test_ubl.mrc"
}) { }) {
InputStream in = getClass().getResource("/org/xbib/marc/" + s).openStream(); StreamMatcher.fileMatch(getClass(), s, ".json", (inputStream, outputStream) -> {
File file = File.createTempFile(s + ".", ".json"); try (MarcJsonWriter writer = new MarcJsonWriter(outputStream, EnumSet.of(MarcJsonWriter.Style.ALLOW_DUPLICATES))
file.deleteOnExit(); ) {
FileOutputStream out = new FileOutputStream(file); Marc.builder()
try (MarcJsonWriter writer = new MarcJsonWriter(out, EnumSet.of(MarcJsonWriter.Style.ALLOW_DUPLICATES)) .setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT)
) { .setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE)
Marc.builder() .setInputStream(inputStream)
.setFormat(MarcXchangeConstants.MARCXCHANGE_FORMAT) .setCharset(Charset.forName("ANSEL"))
.setType(MarcXchangeConstants.BIBLIOGRAPHIC_TYPE) .setMarcListener(writer)
.setInputStream(in) .build()
.setCharset(Charset.forName("ANSEL")) .writeCollection();
.setMarcListener(writer) }
.build() });
.writeCollection();
}
assertStream(s, getClass().getResource("/org/xbib/marc/json/" + s + ".dupkey.json").openStream(),
new FileInputStream(file));
} }
} }
} }

View file

@ -1,15 +1,12 @@
package org.xbib.marc.transformer; package org.xbib.marc.transformer;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.xbib.marc.MarcField; import org.xbib.marc.MarcField;
import org.xbib.marc.transformer.field.MarcFieldTransformer; import org.xbib.marc.transformer.field.MarcFieldTransformer;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/**
*
*/
public class MarcFieldTransformerTest { public class MarcFieldTransformerTest {
@Test @Test
@ -95,7 +92,10 @@ public class MarcFieldTransformerTest {
.ignoreSubfieldIds() .ignoreSubfieldIds()
.drop(MarcField.builder().tag("001").build()) .drop(MarcField.builder().tag("001").build())
.build(); .build();
MarcField a = MarcField.builder().tag("001").subfield("a", "Hello").subfield("b", "World").build(); MarcField a = MarcField.builder().tag("001")
.subfield("a", "Hello")
.subfield("b", "World")
.build();
MarcField b = marcFieldTransformer.transform(a); MarcField b = marcFieldTransformer.transform(a);
assertEquals(MarcField.emptyMarcField(), b); assertEquals(MarcField.emptyMarcField(), b);
} }
@ -162,13 +162,13 @@ public class MarcFieldTransformerTest {
@Test @Test
public void testFromMap() { public void testFromMap() {
Map<String, String> map = new HashMap<>(); Map<String, String> map = Map.of("001$$a", "002$$b","003$$a", "002$$b");
map.put("001$$a", "002$$b");
map.put("003$$a", "002$$b");
MarcFieldTransformer marcFieldTransformer = MarcFieldTransformer.builder() MarcFieldTransformer marcFieldTransformer = MarcFieldTransformer.builder()
.from(map) .from(map)
.build(); .build();
MarcField a = MarcField.builder().tag("001").subfield("a", "Hello World").build(); MarcField a = MarcField.builder().tag("001").subfield("a", "Hello World").build();
assertEquals("001$$a", a.toKey());
assertTrue(marcFieldTransformer.containsKey(a.toKey()));
MarcField b = marcFieldTransformer.transform(a); MarcField b = marcFieldTransformer.transform(a);
assertEquals("002$$b[b=Hello World]", b.toString()); assertEquals("002$$b[b=Hello World]", b.toString());
MarcField a1 = MarcField.builder().tag("003").subfield("a", "Hello World").build(); MarcField a1 = MarcField.builder().tag("003").subfield("a", "Hello World").build();

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd"><record format="MARC21" type="Bibliographic"><leader>01609nam a2200361 a 4500</leader><controlfield tag="001">AYL-3122 </controlfield><controlfield tag="003">CStRLIN </controlfield><controlfield tag="005">20030916095302.0 </controlfield><controlfield tag="008">980203s1999 cc b 000 0 chi </controlfield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">7503401427 (set) :</subfield><subfield code="c">RMBY52.00</subfield></datafield><datafield tag="035" ind1=" " ind2=" "><subfield code="a">(CStRLIN)ONTG98-B1257</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">dCaOTU</subfield><subfield code="c">CaOTU</subfield></datafield><datafield tag="043" ind1=" " ind2=" "><subfield code="a">a-cc---</subfield></datafield><datafield tag="050" ind1=" " ind2="4"><subfield code="a">DS777.543</subfield><subfield code="b">.P352 1999</subfield></datafield><datafield tag="066" ind1=" " ind2=" "><subfield code="c">$1</subfield></datafield><datafield tag="090" ind1=" " ind2=" "><subfield code="a">DS777.543</subfield><subfield code="b">.P352 1999</subfield><subfield code="i">07/04/01 N</subfield></datafield><datafield tag="090" ind1=" " ind2="8"><subfield code="a">DS 777.543 .P35 1991X</subfield><subfield code="b">EAST</subfield><subfield code="c">1</subfield><subfield code="d">1-2</subfield></datafield><datafield tag="245" ind1="0" ind2="0"><subfield code="6">880-01</subfield><subfield code="a">Bai wan guo min dang jun qi yi tou cheng ji shi xu ji /</subfield><subfield code="c">Cai Huilin ... [et al.] bian.</subfield></datafield><datafield tag="250" ind1=" " ind2=" "><subfield code="6">880-02</subfield><subfield code="a">Di 1 ban.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="6">880-03</subfield><subfield code="a">Beijing :</subfield><subfield code="b">Zhongguo wen shi chu ban she :</subfield><subfield code="b">Xin hua shu dian Beijing fa xing suo fa xing,</subfield><subfield code="c">1999.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">2 v. (2, 18, 5, 1152 p.) ;</subfield><subfield code="c">21 cm.</subfield></datafield><datafield tag="504" ind1=" " ind2=" "><subfield code="a">Includes bibliographical references.</subfield></datafield><datafield tag="533" ind1=" " ind2=" "><subfield code="a">Electronic Reproduction</subfield><subfield code="c">University of Toronto</subfield></datafield><datafield tag="596" ind1=" " ind2=" "><subfield code="a">11</subfield></datafield><datafield tag="651" ind1=" " ind2="0"><subfield code="a">China</subfield><subfield code="x">History</subfield><subfield code="y">Civil War, 1945-1949</subfield><subfield code="v">Personal narratives.</subfield></datafield><datafield tag="710" ind1="1" ind2=" "><subfield code="6">880-04</subfield><subfield code="a">Cai, Huilin.</subfield></datafield><datafield tag="856" ind1="4" ind2=" "><subfield code="3">Scholars Portal Books</subfield><subfield code="u">http://books.scholarsportal.info/viewdoc.html?id=/ebooks/oca2/44/amstransactions35579abrauoft</subfield></datafield><datafield tag="880" ind1="0" ind2="0"><subfield code="6">245-01/$1</subfield><subfield code="a">百万 国民党军 起义 投诚 纪实 续集 /</subfield><subfield code="c">蔡 恵林 ... [et al.] 主编.</subfield></datafield><datafield tag="880" ind1=" " ind2=" "><subfield code="6">250-02/$1</subfield><subfield code="a">第1版.</subfield></datafield><datafield tag="880" ind1=" " ind2=" "><subfield code="6">260-03/$1</subfield><subfield code="a">北京 :</subfield><subfield code="b">中国 文史 出版社 :</subfield><subfield code="b">新华 书店 北京 发行所 发行,</subfield><subfield code="c">1999.</subfield></datafield><datafield tag="880" ind1="1" ind2=" "><subfield code="6">710-04/$1</subfield><subfield code="a">蔡 恵林.</subfield></datafield><datafield tag="926" ind1=" " ind2=" "><subfield code="a">EASTASIAN</subfield><subfield code="b">STACKS</subfield><subfield code="c">DS777.543 .P35 1991X V.1</subfield><subfield code="d">BOOK</subfield><subfield code="f">1</subfield></datafield><datafield tag="926" ind1=" " ind2=" "><subfield code="a">EASTASIAN</subfield><subfield code="b">STACKS</subfield><subfield code="c">DS777.543 .P35 1991X V.2</subfield><subfield code="d">BOOK</subfield><subfield code="f">1</subfield></datafield></record></collection> <?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><record format="MARC21" type="Bibliographic"><leader>01609nam a2200361 a 4500</leader><controlfield tag="001">AYL-3122 </controlfield><controlfield tag="003">CStRLIN </controlfield><controlfield tag="005">20030916095302.0 </controlfield><controlfield tag="008">980203s1999 cc b 000 0 chi </controlfield><datafield ind2=" " ind1=" " tag="020"><subfield code="a">7503401427 (set) :</subfield><subfield code="c">RMBY52.00</subfield></datafield><datafield ind2=" " ind1=" " tag="035"><subfield code="a">(CStRLIN)ONTG98-B1257</subfield></datafield><datafield ind2=" " ind1=" " tag="040"><subfield code="a">dCaOTU</subfield><subfield code="c">CaOTU</subfield></datafield><datafield ind2=" " ind1=" " tag="043"><subfield code="a">a-cc---</subfield></datafield><datafield ind2="4" ind1=" " tag="050"><subfield code="a">DS777.543</subfield><subfield code="b">.P352 1999</subfield></datafield><datafield ind2=" " ind1=" " tag="066"><subfield code="c">$1</subfield></datafield><datafield ind2=" " ind1=" " tag="090"><subfield code="a">DS777.543</subfield><subfield code="b">.P352 1999</subfield><subfield code="i">07/04/01 N</subfield></datafield><datafield ind2="8" ind1=" " tag="090"><subfield code="a">DS 777.543 .P35 1991X</subfield><subfield code="b">EAST</subfield><subfield code="c">1</subfield><subfield code="d">1-2</subfield></datafield><datafield ind2="0" ind1="0" tag="245"><subfield code="6">880-01</subfield><subfield code="a">Bai wan guo min dang jun qi yi tou cheng ji shi xu ji /</subfield><subfield code="c">Cai Huilin ... [et al.] bian.</subfield></datafield><datafield ind2=" " ind1=" " tag="250"><subfield code="6">880-02</subfield><subfield code="a">Di 1 ban.</subfield></datafield><datafield ind2=" " ind1=" " tag="260"><subfield code="6">880-03</subfield><subfield code="a">Beijing :</subfield><subfield code="b">Zhongguo wen shi chu ban she :</subfield><subfield code="b">Xin hua shu dian Beijing fa xing suo fa xing,</subfield><subfield code="c">1999.</subfield></datafield><datafield ind2=" " ind1=" " tag="300"><subfield code="a">2 v. (2, 18, 5, 1152 p.) ;</subfield><subfield code="c">21 cm.</subfield></datafield><datafield ind2=" " ind1=" " tag="504"><subfield code="a">Includes bibliographical references.</subfield></datafield><datafield ind2=" " ind1=" " tag="533"><subfield code="a">Electronic Reproduction</subfield><subfield code="c">University of Toronto</subfield></datafield><datafield ind2=" " ind1=" " tag="596"><subfield code="a">11</subfield></datafield><datafield ind2="0" ind1=" " tag="651"><subfield code="a">China</subfield><subfield code="x">History</subfield><subfield code="y">Civil War, 1945-1949</subfield><subfield code="v">Personal narratives.</subfield></datafield><datafield ind2=" " ind1="1" tag="710"><subfield code="6">880-04</subfield><subfield code="a">Cai, Huilin.</subfield></datafield><datafield ind2=" " ind1="4" tag="856"><subfield code="3">Scholars Portal Books</subfield><subfield code="u">http://books.scholarsportal.info/viewdoc.html?id=/ebooks/oca2/44/amstransactions35579abrauoft</subfield></datafield><datafield ind2="0" ind1="0" tag="880"><subfield code="6">245-01/$1</subfield><subfield code="a">百万 国民党军 起义 投诚 纪实 续集 /</subfield><subfield code="c">蔡 恵林 ... [et al.] 主编.</subfield></datafield><datafield ind2=" " ind1=" " tag="880"><subfield code="6">250-02/$1</subfield><subfield code="a">第1版.</subfield></datafield><datafield ind2=" " ind1=" " tag="880"><subfield code="6">260-03/$1</subfield><subfield code="a">北京 :</subfield><subfield code="b">中国 文史 出版社 :</subfield><subfield code="b">新华 书店 北京 发行所 发行,</subfield><subfield code="c">1999.</subfield></datafield><datafield ind2=" " ind1="1" tag="880"><subfield code="6">710-04/$1</subfield><subfield code="a">蔡 恵林.</subfield></datafield><datafield ind2=" " ind1=" " tag="926"><subfield code="a">EASTASIAN</subfield><subfield code="b">STACKS</subfield><subfield code="c">DS777.543 .P35 1991X V.1</subfield><subfield code="d">BOOK</subfield><subfield code="f">1</subfield></datafield><datafield ind2=" " ind1=" " tag="926"><subfield code="a">EASTASIAN</subfield><subfield code="b">STACKS</subfield><subfield code="c">DS777.543 .P35 1991X V.2</subfield><subfield code="d">BOOK</subfield><subfield code="f">1</subfield></datafield></record></collection>

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
01488cam 2200349 a 45000011193987600520041229190604.0008000313s2000 nyu 000 1 eng 906 a7bcbccorignewd1eocipf20gy-gencatlg9250 aacquireb2 shelf copiesxpolicy default955 ato HLCD pc03 03-13-00; lh08 to subj. 03-14-00; lh06 03-22-00; lk02 03-22-00; to Dewey 03-22-00; aa05 03-23-00; ps13 2001-11-06 bk rec'd, to CIP ver.fpv08 2001-11-07 CIP ver. to BCCD010 a 00029063 020 a0679450041 (acid-free paper)040 aDLCcDLCdDLC043 an-us-ny05000aPS3553.H15bA82 200008200a813/.542211001 aChabon, Michael.24514aThe amazing adventures of Kavalier and Clay :ba novel /cMichael Chabon.260 aNew York :bRandom House,cc2000.300 a639 p. ;c25 cm.650 0aComic books, strips, etc.xAuthorshipvFiction.650 0aHeroes in mass mediavFiction.650 0aCzech AmericansvFiction.651 0aNew York (N.Y.)vFiction.650 0aYoung menvFiction.650 0aCartoonistsvFiction.655 7aHumorous stories.2gsafd655 7aBildungsromane.2gsafd856423Contributor biographical informationuhttp://www.loc.gov/catdir/bios/random052/00029063.html856413Sample textuhttp://www.loc.gov/catdir/samples/random044/00029063.html856423Publisher descriptionuhttp://www.loc.gov/catdir/description/random0411/00029063.html01185cam 2200301 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 906 a7bcbccorignewd1eocipf20gy-gencatlg9250 aacquireb2 shelf copiesxpolicy default955 apc14 2002-08-05 to HLCDclh08 2002-08-06 to subj.;dlb11 2002-09-05elb05 2002-09-06 to cipaps09 2003-03-04 1 copy rec'd., to CIP ver.fpv01 2003-03-17 CIP ver to BCCDald11 2003-05-12 cp2 to BCCD010 a 2002027497020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC042 alcac05000aPZ7.C3315bSu 200208200a[Fic]2211001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction.952 aII lb11 09-05-02

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
01488cam 2200349 a 45000011193987600520041229190604.0008000313s2000 nyu 000 1 eng 906 a7bcbccorignewd1eocipf20gy-gencatlg9250 aacquireb2 shelf copiesxpolicy default955 ato HLCD pc03 03-13-00; lh08 to subj. 03-14-00; lh06 03-22-00; lk02 03-22-00; to Dewey 03-22-00; aa05 03-23-00; ps13 2001-11-06 bk rec'd, to CIP ver.fpv08 2001-11-07 CIP ver. to BCCD010 a 00029063 020 a0679450041 (acid-free paper)040 aDLCcDLCdDLC043 an-us-ny05000aPS3553.H15bA82 200008200a813/.542211001 aChabon, Michael.24514aThe amazing adventures of Kavalier and Clay :ba novel /cMichael Chabon.260 aNew York :bRandom House,cc2000.300 a639 p. ;c25 cm.650 0aComic books, strips, etc.xAuthorshipvFiction.650 0aHeroes in mass mediavFiction.650 0aCzech AmericansvFiction.651 0aNew York (N.Y.)vFiction.650 0aYoung menvFiction.650 0aCartoonistsvFiction.655 7aHumorous stories.2gsafd655 7aBildungsromane.2gsafd856423Contributor biographical informationuhttp://www.loc.gov/catdir/bios/random052/00029063.html856413Sample textuhttp://www.loc.gov/catdir/samples/random044/00029063.html856423Publisher descriptionuhttp://www.loc.gov/catdir/description/random0411/00029063.html01185cam 2200301 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 906 a7bcbccorignewd1eocipf20gy-gencatlg9250 aacquireb2 shelf copiesxpolicy default955 apc14 2002-08-05 to HLCDclh08 2002-08-06 to subj.;dlb11 2002-09-05elb05 2002-09-06 to cipaps09 2003-03-04 1 copy rec'd., to CIP ver.fpv01 2003-03-17 CIP ver to BCCDald11 2003-05-12 cp2 to BCCD010 a 2002027497020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC042 alcac05000aPZ7.C3315bSu 200208200a[Fic]2211001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction.952 aII lb11 09-05-02 01488cam 2200349 a 45000011193987600520041229190604.0008000313s2000 nyu 000 1 eng 906 a7bcbccorignewd1eocipf20gy-gencatlg9250 aacquireb2 shelf copiesxpolicy default955 ato HLCD pc03 03-13-00; lh08 to subj. 03-14-00; lh06 03-22-00; lk02 03-22-00; to Dewey 03-22-00; aa05 03-23-00; ps13 2001-11-06 bk rec'd, to CIP ver.fpv08 2001-11-07 CIP ver. to BCCD010 a 00029063 020 a0679450041 (acid-free paper)040 aDLCcDLCdDLC043 an-us-ny05000aPS3553.H15bA82 200008200a813/.542211001 aChabon, Michael.24514aThe amazing adventures of Kavalier and Clay :ba novel /cMichael Chabon.260 aNew York :bRandom House,cc2000.300 a639 p. ;c25 cm.650 0aComic books, strips, etc.xAuthorshipvFiction.650 0aHeroes in mass mediavFiction.650 0aCzech AmericansvFiction.651 0aNew York (N.Y.)vFiction.650 0aYoung menvFiction.650 0aCartoonistsvFiction.655 7aHumorous stories.2gsafd655 7aBildungsromane.2gsafd856423Contributor biographical informationuhttp://www.loc.gov/catdir/bios/random052/00029063.html856413Sample textuhttp://www.loc.gov/catdir/samples/random044/00029063.html856423Publisher descriptionuhttp://www.loc.gov/catdir/description/random0411/00029063.html01185cam 2200301 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 906 a7bcbccorignewd1eocipf20gy-gencatlg9250 aacquireb2 shelf copiesxpolicy default955 apc14 2002-08-05 to HLCDclh08 2002-08-06 to subj.;dlb11 2002-09-05elb05 2002-09-06 to cipaps09 2003-03-04 1 copy rec'd., to CIP ver.fpv01 2003-03-17 CIP ver to BCCDald11 2003-05-12 cp2 to BCCD010 a 2002027497020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC042 alcac05000aPZ7.C3315bSu 200208200a[Fic]2211001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction.952 aII lb11 09-05-02

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
00759cam a2200229 a 45000011193987600520041229190604.0008000313s2000 nyu 000 1 eng 020 a0679450041 (acid-free paper)040 aDLCcDLCdDLC1001 aChabon, Michael.24514aThe amazing adventures of Kavalier and Clay :ba novel /cMichael Chabon.260 aNew York :bRandom House,cc2000.300 a639 p. ;c25 cm.650 0aComic books, strips, etc.xAuthorshipvFiction.650 0aHeroes in mass mediavFiction.650 0aCzech AmericansvFiction.651 0aNew York (N.Y.)vFiction.650 0aYoung menvFiction.650 0aCartoonistsvFiction.655 7aHumorous stories.2gsafd655 7aBildungsromane.2gsafd00714cam a2200205 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC1001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction.

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd"><record format="MARC21" type="Bibliographic"><leader>00759cam a2200229 a 4500</leader><controlfield tag="001">11939876</controlfield><controlfield tag="005">20041229190604.0</controlfield><controlfield tag="008">000313s2000 nyu 000 1 eng </controlfield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0679450041 (acid-free paper)</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield tag="100" ind1="1" ind2=" "><subfield code="a">Chabon, Michael.</subfield></datafield><datafield tag="245" ind1="1" ind2="4"><subfield code="a">The amazing adventures of Kavalier and Clay :</subfield><subfield code="b">a novel /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">New York :</subfield><subfield code="b">Random House,</subfield><subfield code="c">c2000.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">639 p. ;</subfield><subfield code="c">25 cm.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Comic books, strips, etc.</subfield><subfield code="x">Authorship</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Heroes in mass media</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Czech Americans</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="651" ind1=" " ind2="0"><subfield code="a">New York (N.Y.)</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Young men</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="0"><subfield code="a">Cartoonists</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="655" ind1=" " ind2="7"><subfield code="a">Humorous stories.</subfield><subfield code="2">gsafd</subfield></datafield><datafield tag="655" ind1=" " ind2="7"><subfield code="a">Bildungsromane.</subfield><subfield code="2">gsafd</subfield></datafield></record><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0786808772</subfield></datafield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield tag="100" ind1="1" ind2=" "><subfield code="a">Chabon, Michael.</subfield></datafield><datafield tag="245" ind1="1" ind2="0"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield tag="250" ind1=" " ind2=" "><subfield code="a">1st ed.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield tag="520" ind1=" " ind2=" "><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Fantasy.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>

View file

@ -1 +1 @@
00759cam a2200229 a 45000011193987600520041229190604.0008000313s2000 nyu 000 1 eng 020 a0679450041 (acid-free paper)040 aDLCcDLCdDLC1001 aChabon, Michael.24514aThe amazing adventures of Kavalier and Clay :ba novel /cMichael Chabon.260 aNew York :bRandom House,cc2000.300 a639 p. ;c25 cm.650 0aComic books, strips, etc.xAuthorshipvFiction.650 0aHeroes in mass mediavFiction.650 0aCzech AmericansvFiction.651 0aNew York (N.Y.)vFiction.650 0aYoung menvFiction.650 0aCartoonistsvFiction.655 7aHumorous stories.2gsafd655 7aBildungsromane.2gsafd00714cam a2200205 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC1001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction. 00759cam a2200229 a 45000011193987600520041229190604.0008000313s2000 nyu 000 1 eng 020 a0679450041 (acid-free paper)040 aDLCcDLCdDLC1001 aChabon, Michael.24514aThe amazing adventures of Kavalier and Clay :ba novel /cMichael Chabon.260 aNew York :bRandom House,cc2000.300 a639 p. ;c25 cm.650 0aComic books, strips, etc.xAuthorshipvFiction.650 0aHeroes in mass mediavFiction.650 0aCzech AmericansvFiction.651 0aNew York (N.Y.)vFiction.650 0aYoung menvFiction.650 0aCartoonistsvFiction.655 7aHumorous stories.2gsafd655 7aBildungsromane.2gsafd00714cam a2200205 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC1001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction.

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><record format="MARC21" type="Bibliographic"><leader>00759cam a2200229 a 4500</leader><controlfield tag="001">11939876</controlfield><controlfield tag="005">20041229190604.0</controlfield><controlfield tag="008">000313s2000 nyu 000 1 eng </controlfield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0679450041 (acid-free paper)</subfield></datafield><datafield ind2="_" ind1="_" tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2="_" ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="4" ind1="1" tag="245"><subfield code="a">The amazing adventures of Kavalier and Clay :</subfield><subfield code="b">a novel /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2="_" ind1="_" tag="260"><subfield code="a">New York :</subfield><subfield code="b">Random House,</subfield><subfield code="c">c2000.</subfield></datafield><datafield ind2="_" ind1="_" tag="300"><subfield code="a">639 p. ;</subfield><subfield code="c">25 cm.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Comic books, strips, etc.</subfield><subfield code="x">Authorship</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Heroes in mass media</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Czech Americans</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="651"><subfield code="a">New York (N.Y.)</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Young men</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1="_" tag="650"><subfield code="a">Cartoonists</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="7" ind1="_" tag="655"><subfield code="a">Humorous stories.</subfield><subfield code="2">gsafd</subfield></datafield><datafield ind2="7" ind1="_" tag="655"><subfield code="a">Bildungsromane.</subfield><subfield code="2">gsafd</subfield></datafield></record><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0786808772</subfield></datafield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield ind2="_" ind1="_" tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2="_" ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="0" ind1="1" tag="245"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2="_" ind1="_" tag="250"><subfield code="a">1st ed.</subfield></datafield><datafield ind2="_" ind1="_" tag="260"><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield ind2="_" ind1="_" tag="300"><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield ind2="_" ind1="_" tag="520"><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Fantasy.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection> <?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><record format="MARC21" type="Bibliographic"><leader>00759cam a2200229 a 4500</leader><controlfield tag="001">11939876</controlfield><controlfield tag="005">20041229190604.0</controlfield><controlfield tag="008">000313s2000 nyu 000 1 eng </controlfield><datafield ind2=" " ind1=" " tag="020"><subfield code="a">0679450041 (acid-free paper)</subfield></datafield><datafield ind2=" " ind1=" " tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2=" " ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="4" ind1="1" tag="245"><subfield code="a">The amazing adventures of Kavalier and Clay :</subfield><subfield code="b">a novel /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2=" " ind1=" " tag="260"><subfield code="a">New York :</subfield><subfield code="b">Random House,</subfield><subfield code="c">c2000.</subfield></datafield><datafield ind2=" " ind1=" " tag="300"><subfield code="a">639 p. ;</subfield><subfield code="c">25 cm.</subfield></datafield><datafield ind2="0" ind1=" " tag="650"><subfield code="a">Comic books, strips, etc.</subfield><subfield code="x">Authorship</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1=" " tag="650"><subfield code="a">Heroes in mass media</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1=" " tag="650"><subfield code="a">Czech Americans</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1=" " tag="651"><subfield code="a">New York (N.Y.)</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1=" " tag="650"><subfield code="a">Young men</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="0" ind1=" " tag="650"><subfield code="a">Cartoonists</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="7" ind1=" " tag="655"><subfield code="a">Humorous stories.</subfield><subfield code="2">gsafd</subfield></datafield><datafield ind2="7" ind1=" " tag="655"><subfield code="a">Bildungsromane.</subfield><subfield code="2">gsafd</subfield></datafield></record><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield ind2=" " ind1=" " tag="020"><subfield code="a">0786808772</subfield></datafield><datafield ind2=" " ind1=" " tag="020"><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield ind2=" " ind1=" " tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2=" " ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="0" ind1="1" tag="245"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2=" " ind1=" " tag="250"><subfield code="a">1st ed.</subfield></datafield><datafield ind2=" " ind1=" " tag="260"><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield ind2=" " ind1=" " tag="300"><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield ind2=" " ind1=" " tag="520"><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Fantasy.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>

View file

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="info:lc/xmlns/marcxchange-v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd"> <collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<record format="MARC21" type="Bibliographic"> <record format="MARC21" type="Bibliographic">
<leader>01969cam 2200529 i 4500</leader> <leader>01969cam 2200529 i 4500</leader>
<controlfield tag="001">u6015439</controlfield> <controlfield tag="001">u6015439</controlfield>
<controlfield tag="003">SIRSI</controlfield> <controlfield tag="003">SIRSI</controlfield>
<controlfield tag="005">20131218125548.0</controlfield> <controlfield tag="005">20131218125548.0</controlfield>
<controlfield tag="008">130329s2013 ru 000 1 ruso </controlfield> <controlfield tag="008">130329s2013 ru 000 1 ruso </controlfield>
<datafield tag="010" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="010">
<subfield code="a"> 2013403212</subfield> <subfield code="a"> 2013403212</subfield>
</datafield> </datafield>
<datafield tag="040" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="040">
<subfield code="a">DLC</subfield> <subfield code="a">DLC</subfield>
<subfield code="b">eng</subfield> <subfield code="b">eng</subfield>
<subfield code="e">rda</subfield> <subfield code="e">rda</subfield>
@ -22,146 +22,146 @@
<subfield code="d">ZCU</subfield> <subfield code="d">ZCU</subfield>
<subfield code="d">STF</subfield> <subfield code="d">STF</subfield>
</datafield> </datafield>
<datafield tag="066" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="066">
<subfield code="c">(N</subfield> <subfield code="c">(N</subfield>
</datafield> </datafield>
<datafield tag="019" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="019">
<subfield code="a">846680176</subfield> <subfield code="a">846680176</subfield>
</datafield> </datafield>
<datafield tag="020" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="020">
<subfield code="a">9785699626076</subfield> <subfield code="a">9785699626076</subfield>
</datafield> </datafield>
<datafield tag="020" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="020">
<subfield code="a">5699626077</subfield> <subfield code="a">5699626077</subfield>
</datafield> </datafield>
<datafield tag="035" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="035">
<subfield code="a">(OCoLC)846683294</subfield> <subfield code="a">(OCoLC)846683294</subfield>
<subfield code="z">(OCoLC)846680176</subfield> <subfield code="z">(OCoLC)846680176</subfield>
</datafield> </datafield>
<datafield tag="042" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="042">
<subfield code="a">pcc</subfield> <subfield code="a">pcc</subfield>
</datafield> </datafield>
<datafield tag="043" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="043">
<subfield code="a">e-ur---</subfield> <subfield code="a">e-ur---</subfield>
</datafield> </datafield>
<datafield tag="050" ind1="0" ind2="0"> <datafield ind2="0" ind1="0" tag="050">
<subfield code="a">PG3479.4.U485</subfield> <subfield code="a">PG3479.4.U485</subfield>
<subfield code="b">V67 2013</subfield> <subfield code="b">V67 2013</subfield>
</datafield> </datafield>
<datafield tag="082" ind1="0" ind2="4"> <datafield ind2="4" ind1="0" tag="082">
<subfield code="a">891.7</subfield> <subfield code="a">891.7</subfield>
<subfield code="2">23</subfield> <subfield code="2">23</subfield>
</datafield> </datafield>
<datafield tag="049" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="049">
<subfield code="a">VA@@</subfield> <subfield code="a">VA@@</subfield>
</datafield> </datafield>
<datafield tag="100" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="100">
<subfield code="6">880-01</subfield> <subfield code="6">880-01</subfield>
<subfield code="a">Buĭda, I͡Uriĭ.</subfield> <subfield code="a">Buĭda, I͡Uriĭ.</subfield>
</datafield> </datafield>
<datafield tag="245" ind1="1" ind2="0"> <datafield ind2="0" ind1="1" tag="245">
<subfield code="6">880-02</subfield> <subfield code="6">880-02</subfield>
<subfield code="a">Vor, shpion i ubiĭt͡sa /</subfield> <subfield code="a">Vor, shpion i ubiĭt͡sa /</subfield>
<subfield code="c">I͡Uriĭ Buĭda.</subfield> <subfield code="c">I͡Uriĭ Buĭda.</subfield>
</datafield> </datafield>
<datafield tag="264" ind1=" " ind2="1"> <datafield ind2="1" ind1=" " tag="264">
<subfield code="6">880-03</subfield> <subfield code="6">880-03</subfield>
<subfield code="a">Moskva :</subfield> <subfield code="a">Moskva :</subfield>
<subfield code="b">ĖKSMO,</subfield> <subfield code="b">ĖKSMO,</subfield>
<subfield code="c">2013.</subfield> <subfield code="c">2013.</subfield>
</datafield> </datafield>
<datafield tag="300" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="300">
<subfield code="a">314 pages ;</subfield> <subfield code="a">314 pages ;</subfield>
<subfield code="c">21 cm.</subfield> <subfield code="c">21 cm.</subfield>
</datafield> </datafield>
<datafield tag="336" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="336">
<subfield code="a">text</subfield> <subfield code="a">text</subfield>
<subfield code="2">rdacontent</subfield> <subfield code="2">rdacontent</subfield>
</datafield> </datafield>
<datafield tag="337" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="337">
<subfield code="a">unmediated</subfield> <subfield code="a">unmediated</subfield>
<subfield code="2">rdamedia</subfield> <subfield code="2">rdamedia</subfield>
</datafield> </datafield>
<datafield tag="338" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="338">
<subfield code="a">volume</subfield> <subfield code="a">volume</subfield>
<subfield code="2">rdacarrier</subfield> <subfield code="2">rdacarrier</subfield>
</datafield> </datafield>
<datafield tag="490" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="490">
<subfield code="6">880-04</subfield> <subfield code="6">880-04</subfield>
<subfield code="a">Bolʹshai͡a literatura. Proza I͡Urii͡a Buĭdy</subfield> <subfield code="a">Bolʹshai͡a literatura. Proza I͡Urii͡a Buĭdy</subfield>
</datafield> </datafield>
<datafield tag="651" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="651">
<subfield code="a">Soviet Union</subfield> <subfield code="a">Soviet Union</subfield>
<subfield code="x">Social conditions</subfield> <subfield code="x">Social conditions</subfield>
<subfield code="y">1945-1991</subfield> <subfield code="y">1945-1991</subfield>
<subfield code="v">Fiction.</subfield> <subfield code="v">Fiction.</subfield>
</datafield> </datafield>
<datafield tag="650" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="650">
<subfield code="a">Authorship</subfield> <subfield code="a">Authorship</subfield>
<subfield code="v">Fiction.</subfield> <subfield code="v">Fiction.</subfield>
</datafield> </datafield>
<datafield tag="653" ind1="0" ind2=" "> <datafield ind2=" " ind1="0" tag="653">
<subfield code="a">Prose. Prose fiction.</subfield> <subfield code="a">Prose. Prose fiction.</subfield>
</datafield> </datafield>
<datafield tag="653" ind1="0" ind2=" "> <datafield ind2=" " ind1="0" tag="653">
<subfield code="a">Russian literature.</subfield> <subfield code="a">Russian literature.</subfield>
</datafield> </datafield>
<datafield tag="655" ind1=" " ind2="7"> <datafield ind2="7" ind1=" " tag="655">
<subfield code="a">Psychological fiction.</subfield> <subfield code="a">Psychological fiction.</subfield>
<subfield code="2">lcsh</subfield> <subfield code="2">lcsh</subfield>
</datafield> </datafield>
<datafield tag="655" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="655">
<subfield code="a">Psychological fiction.</subfield> <subfield code="a">Psychological fiction.</subfield>
</datafield> </datafield>
<datafield tag="655" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="655">
<subfield code="a">Russian language materials.</subfield> <subfield code="a">Russian language materials.</subfield>
</datafield> </datafield>
<datafield tag="800" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="800">
<subfield code="a">Buĭda, I͡Uriĭ.</subfield> <subfield code="a">Buĭda, I͡Uriĭ.</subfield>
<subfield code="t">Bolʹshai͡a literatura.</subfield> <subfield code="t">Bolʹshai͡a literatura.</subfield>
<subfield code="p">Proza I͡Urii͡a Buĭdy.</subfield> <subfield code="p">Proza I͡Urii͡a Buĭdy.</subfield>
</datafield> </datafield>
<datafield tag="830" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="830">
<subfield code="6">880-05</subfield> <subfield code="6">880-05</subfield>
<subfield code="a">Bolʹshai͡a literatura. Proza I͡Urii͡a Buĭdy.</subfield> <subfield code="a">Bolʹshai͡a literatura. Proza I͡Urii͡a Buĭdy.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="880">
<subfield code="6">100-01/(N</subfield> <subfield code="6">100-01/(N</subfield>
<subfield code="a">Буйда, Юрий.</subfield> <subfield code="a">Буйда, Юрий.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1="1" ind2="0"> <datafield ind2="0" ind1="1" tag="880">
<subfield code="6">245-02/(N</subfield> <subfield code="6">245-02/(N</subfield>
<subfield code="a">Вор, шпион и убийца /</subfield> <subfield code="a">Вор, шпион и убийца /</subfield>
<subfield code="c">Юрий Буйда.</subfield> <subfield code="c">Юрий Буйда.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="880">
<subfield code="6">260-00/(N</subfield> <subfield code="6">260-00/(N</subfield>
<subfield code="a">Москва :</subfield> <subfield code="a">Москва :</subfield>
<subfield code="b">Эксмо,</subfield> <subfield code="b">Эксмо,</subfield>
<subfield code="c">2013.</subfield> <subfield code="c">2013.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1=" " ind2="1"> <datafield ind2="1" ind1=" " tag="880">
<subfield code="6">264-03/(N</subfield> <subfield code="6">264-03/(N</subfield>
<subfield code="a">Москва :</subfield> <subfield code="a">Москва :</subfield>
<subfield code="b">ЭКСМО,</subfield> <subfield code="b">ЭКСМО,</subfield>
<subfield code="c">2013.</subfield> <subfield code="c">2013.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="880">
<subfield code="6">490-04/(N</subfield> <subfield code="6">490-04/(N</subfield>
<subfield code="a">Большая литература. Проза Юрия Буйды.</subfield> <subfield code="a">Большая литература. Проза Юрия Буйды.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="880">
<subfield code="6">830-05/(N</subfield> <subfield code="6">830-05/(N</subfield>
<subfield code="a">Большая литература. Проза Юрия Буйды.</subfield> <subfield code="a">Большая литература. Проза Юрия Буйды.</subfield>
</datafield> </datafield>
<datafield tag="994" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="994">
<subfield code="a">C0</subfield> <subfield code="a">C0</subfield>
<subfield code="b">VA@</subfield> <subfield code="b">VA@</subfield>
</datafield> </datafield>
<datafield tag="596" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="596">
<subfield code="a">2</subfield> <subfield code="a">2</subfield>
</datafield> </datafield>
<datafield tag="999" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="999">
<subfield code="a">PG3479.4 .U485 V67 2013</subfield> <subfield code="a">PG3479.4 .U485 V67 2013</subfield>
<subfield code="w">LC</subfield> <subfield code="w">LC</subfield>
<subfield code="c">1</subfield> <subfield code="c">1</subfield>
@ -185,112 +185,112 @@
<controlfield tag="003">SIRSI</controlfield> <controlfield tag="003">SIRSI</controlfield>
<controlfield tag="005">20110414115648.0</controlfield> <controlfield tag="005">20110414115648.0</controlfield>
<controlfield tag="008">101102s2010 ru 000 1 rus </controlfield> <controlfield tag="008">101102s2010 ru 000 1 rus </controlfield>
<datafield tag="010" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="010">
<subfield code="a"> 2010522867</subfield> <subfield code="a"> 2010522867</subfield>
</datafield> </datafield>
<datafield tag="020" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="020">
<subfield code="a">9785699456116</subfield> <subfield code="a">9785699456116</subfield>
</datafield> </datafield>
<datafield tag="020" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="020">
<subfield code="a">5699456112</subfield> <subfield code="a">5699456112</subfield>
</datafield> </datafield>
<datafield tag="035" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="035">
<subfield code="a">(OCoLC)673667835</subfield> <subfield code="a">(OCoLC)673667835</subfield>
</datafield> </datafield>
<datafield tag="040" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="040">
<subfield code="a">DLC</subfield> <subfield code="a">DLC</subfield>
<subfield code="c">DLC</subfield> <subfield code="c">DLC</subfield>
<subfield code="d">SXP</subfield> <subfield code="d">SXP</subfield>
<subfield code="d">EVIEW</subfield> <subfield code="d">EVIEW</subfield>
<subfield code="d">UEICP</subfield> <subfield code="d">UEICP</subfield>
</datafield> </datafield>
<datafield tag="042" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="042">
<subfield code="a">pcc</subfield> <subfield code="a">pcc</subfield>
</datafield> </datafield>
<datafield tag="050" ind1="0" ind2="0"> <datafield ind2="0" ind1="0" tag="050">
<subfield code="a">PG3485.7.U225</subfield> <subfield code="a">PG3485.7.U225</subfield>
<subfield code="b">S57 2010</subfield> <subfield code="b">S57 2010</subfield>
</datafield> </datafield>
<datafield tag="066" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="066">
<subfield code="c">(N</subfield> <subfield code="c">(N</subfield>
</datafield> </datafield>
<datafield tag="082" ind1="0" ind2="4"> <datafield ind2="4" ind1="0" tag="082">
<subfield code="a">891.73/42</subfield> <subfield code="a">891.73/42</subfield>
<subfield code="2">22</subfield> <subfield code="2">22</subfield>
</datafield> </datafield>
<datafield tag="100" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="100">
<subfield code="6">880-03</subfield> <subfield code="6">880-03</subfield>
<subfield code="a">Rubina, Dina.</subfield> <subfield code="a">Rubina, Dina.</subfield>
</datafield> </datafield>
<datafield tag="245" ind1="1" ind2="0"> <datafield ind2="0" ind1="1" tag="245">
<subfield code="6">880-01</subfield> <subfield code="6">880-01</subfield>
<subfield code="a">Sindrom Petrushki :</subfield> <subfield code="a">Sindrom Petrushki :</subfield>
<subfield code="b">roman /</subfield> <subfield code="b">roman /</subfield>
<subfield code="c">Dina Rubina.</subfield> <subfield code="c">Dina Rubina.</subfield>
</datafield> </datafield>
<datafield tag="260" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="260">
<subfield code="6">880-02</subfield> <subfield code="6">880-02</subfield>
<subfield code="a">Moskva :</subfield> <subfield code="a">Moskva :</subfield>
<subfield code="b">Ėksmo,</subfield> <subfield code="b">Ėksmo,</subfield>
<subfield code="c">2010.</subfield> <subfield code="c">2010.</subfield>
</datafield> </datafield>
<datafield tag="260" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="260">
<subfield code="6">880-04</subfield> <subfield code="6">880-04</subfield>
<subfield code="a">Moskva :</subfield> <subfield code="a">Moskva :</subfield>
<subfield code="b">ĖKSMO,</subfield> <subfield code="b">ĖKSMO,</subfield>
<subfield code="c">2010.</subfield> <subfield code="c">2010.</subfield>
</datafield> </datafield>
<datafield tag="300" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="300">
<subfield code="a">427 p. ;</subfield> <subfield code="a">427 p. ;</subfield>
<subfield code="c">21 cm.</subfield> <subfield code="c">21 cm.</subfield>
</datafield> </datafield>
<datafield tag="650" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="650">
<subfield code="a">Dolls</subfield> <subfield code="a">Dolls</subfield>
<subfield code="v">Fiction.</subfield> <subfield code="v">Fiction.</subfield>
</datafield> </datafield>
<datafield tag="650" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="650">
<subfield code="a">Conduct of life</subfield> <subfield code="a">Conduct of life</subfield>
<subfield code="v">Fiction.</subfield> <subfield code="v">Fiction.</subfield>
</datafield> </datafield>
<datafield tag="650" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="650">
<subfield code="a">Suspense fiction.</subfield> <subfield code="a">Suspense fiction.</subfield>
</datafield> </datafield>
<datafield tag="650" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="650">
<subfield code="a">Psychological fiction.</subfield> <subfield code="a">Psychological fiction.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="880">
<subfield code="6">100-03/(N</subfield> <subfield code="6">100-03/(N</subfield>
<subfield code="a">Рубина, Дина.</subfield> <subfield code="a">Рубина, Дина.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1="1" ind2="0"> <datafield ind2="0" ind1="1" tag="880">
<subfield code="6">245-01/(N</subfield> <subfield code="6">245-01/(N</subfield>
<subfield code="a">Синдром Петрушки :</subfield> <subfield code="a">Синдром Петрушки :</subfield>
<subfield code="b">роман /</subfield> <subfield code="b">роман /</subfield>
<subfield code="c">Дина РубинА</subfield> <subfield code="c">Дина РубинА</subfield>
</datafield> </datafield>
<datafield tag="880" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="880">
<subfield code="6">260-02/(N</subfield> <subfield code="6">260-02/(N</subfield>
<subfield code="a">Москва :</subfield> <subfield code="a">Москва :</subfield>
<subfield code="b">ЭКсмо,</subfield> <subfield code="b">ЭКсмо,</subfield>
<subfield code="c">2010.</subfield> <subfield code="c">2010.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="880">
<subfield code="6">260-04/(N</subfield> <subfield code="6">260-04/(N</subfield>
<subfield code="a">Москва :</subfield> <subfield code="a">Москва :</subfield>
<subfield code="b">ЭКСМО,</subfield> <subfield code="b">ЭКСМО,</subfield>
<subfield code="c">2010.</subfield> <subfield code="c">2010.</subfield>
</datafield> </datafield>
<datafield tag="994" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="994">
<subfield code="a">Z0</subfield> <subfield code="a">Z0</subfield>
<subfield code="b">VA@</subfield> <subfield code="b">VA@</subfield>
</datafield> </datafield>
<datafield tag="970" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="970">
<subfield code="a">Marcive</subfield> <subfield code="a">Marcive</subfield>
</datafield> </datafield>
<datafield tag="596" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="596">
<subfield code="a">2</subfield> <subfield code="a">2</subfield>
</datafield> </datafield>
<datafield tag="999" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="999">
<subfield code="a">PG3485.7 .U225 S57 2010</subfield> <subfield code="a">PG3485.7 .U225 S57 2010</subfield>
<subfield code="w">LC</subfield> <subfield code="w">LC</subfield>
<subfield code="c">1</subfield> <subfield code="c">1</subfield>

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><record format="MARC21" type="Bibliographic"><leader>03059cam 2200301 i 4500</leader><controlfield tag="001"> 77123332 </controlfield><controlfield tag="003">DLC</controlfield><controlfield tag="005">20051218154744.0</controlfield><controlfield tag="008">981008b2001 ilu 000 0 eng </controlfield><datafield ind2="_" ind1="_" tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2="_" ind1="_" tag="010"><subfield code="a"> 77123332 </subfield></datafield><datafield ind2="0" ind1="0" tag="245"><subfield code="a">OCLC diacritic and special character test record.</subfield></datafield><datafield ind2="_" ind1="_" tag="260"><subfield code="a">ny :</subfield><subfield code="b">ny,</subfield><subfield code="c">2001.</subfield></datafield><datafield ind2="_" ind1="_" tag="300"><subfield code="a">100 p. ;</subfield><subfield code="c">12 cm.</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 0 (NEW): Degree sign (°); Phono Copyright mark (℗); Copyright mark (©); Sharp (♯); Inverted Question mark (¿); Inverted Exclamation mark (¡); Eszett (ß); Euro (€).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 1: Script L (); Polish L (Ł); Scandanavian O (Ø); D with Crossbar (Đ); Icelandic Thorn (Þ); AE Digraph (Æ); OE Digraph (Œ); Miagkii Znak (ʹ); Dot at Midline (·).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 2: Musical Flat (♭); Patent Mark (®); Plus or Minus (±); O Hook (Ơ); U Hook (Ư); Alif (ʼ); alpha (α); Ayn (ʻ); Polish l (ł).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 3: Scandanavian o (ø); d with crossbar (đ); Icelandic Thorn (þ); ae Digraph (æ); oe Digraph (œ); Tverdii Znak (ʺ); Turkish i (ı); British Pound (£); eth (ð).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 4: Dagger (DO NOT USE); o Hook (ơ); u Hook (ư); Beta (β); Gamma (γ); Superscript 0 (⁰); Superscript 1 (¹); Superscript 2 (²); Superscript 3 (³).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 5: Superscript 4 (⁴); Superscript 5 (⁵); Superscript 6 (⁶); Superscript 7 (⁷); Superscript 8 (⁸); Superscript 9 (⁹); Superscript + (⁺); Superscript - (⁻); Superscript ( (⁽).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 6: Superscript ) (⁾); Subscript 0 (₀); Subscript 1 (₁); Subscript 2 (₂); Subscript 3 (₃); Subscript 4 (₄); Subscript 5 (₅); Subscript 6 (₆); Subscript 7 (₇).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 7: Subscript 8 (₈); Subscript 9 (₉); Subscript + (₊); Subscript - (₋); Subscript ( (₍); Subscript ) (₎); Pseudo Question Mark (ỏ); Grave (ò); Acute (ó).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 8: Circumflex (ô); Tilde (õ); Macron (ō); Breve (ŏ); Superior Dot (ȯ); Umlaut (ö); Hacek (ǒ); Circle Above (o̊); Ligature left (o͡).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 9: Ligature right (o) ; High Comma off center (o̕); Double Acute (ő); Candrabindu (o̐); Cedilla (o̧); Right Hook (ǫ); Dot Below (ọ); Double Dot Below (o̤); Circle Below (o̥).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER COLUMN 10: Double Underscore (o̳); Underscore (o̲); Left Hook (o̦); Right Cedilla (o̜); Upadhmaniya (o̮); Double Tilde 1st half (o͠); Double Tilde 2nd half (o) ; High Comma centered (o̓).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">VOYAGER PC Keyboard: Spacing Circumflex (^); Spacing Underscore (_); Spacing Grave (`); Open Curly Bracket ({); Close Curly Bracket (}); Spacing Tilde (~).</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">Standard PC Keyboard: 1234567890-= !@#$%^&amp;*()_+ qwertyuiop[]\ QWERTYUIOP{}| asdfghjkl;' ASDFGHJKL:" zxcvbnm,./ ZXCVBNM&lt;&gt;?</subfield></datafield><datafield ind2="_" ind1="_" tag="500"><subfield code="a">Double Tilde, 1st and 2nd halves (o͠o) ; Ligature, both halves (o͡o).</subfield></datafield></record></collection> <?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><record format="MARC21" type="Bibliographic"><leader>03059cam 2200301 i 4500</leader><controlfield tag="001"> 77123332 </controlfield><controlfield tag="003">DLC</controlfield><controlfield tag="005">20051218154744.0</controlfield><controlfield tag="008">981008b2001 ilu 000 0 eng </controlfield><datafield ind2=" " ind1=" " tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2=" " ind1=" " tag="010"><subfield code="a"> 77123332 </subfield></datafield><datafield ind2="0" ind1="0" tag="245"><subfield code="a">OCLC diacritic and special character test record.</subfield></datafield><datafield ind2=" " ind1=" " tag="260"><subfield code="a">ny :</subfield><subfield code="b">ny,</subfield><subfield code="c">2001.</subfield></datafield><datafield ind2=" " ind1=" " tag="300"><subfield code="a">100 p. ;</subfield><subfield code="c">12 cm.</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 0 (NEW): Degree sign (°); Phono Copyright mark (℗); Copyright mark (©); Sharp (♯); Inverted Question mark (¿); Inverted Exclamation mark (¡); Eszett (ß); Euro (€).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 1: Script L (); Polish L (Ł); Scandanavian O (Ø); D with Crossbar (Đ); Icelandic Thorn (Þ); AE Digraph (Æ); OE Digraph (Œ); Miagkii Znak (ʹ); Dot at Midline (·).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 2: Musical Flat (♭); Patent Mark (®); Plus or Minus (±); O Hook (Ơ); U Hook (Ư); Alif (ʼ); alpha (α); Ayn (ʻ); Polish l (ł).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 3: Scandanavian o (ø); d with crossbar (đ); Icelandic Thorn (þ); ae Digraph (æ); oe Digraph (œ); Tverdii Znak (ʺ); Turkish i (ı); British Pound (£); eth (ð).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 4: Dagger (DO NOT USE); o Hook (ơ); u Hook (ư); Beta (β); Gamma (γ); Superscript 0 (⁰); Superscript 1 (¹); Superscript 2 (²); Superscript 3 (³).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 5: Superscript 4 (⁴); Superscript 5 (⁵); Superscript 6 (⁶); Superscript 7 (⁷); Superscript 8 (⁸); Superscript 9 (⁹); Superscript + (⁺); Superscript - (⁻); Superscript ( (⁽).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 6: Superscript ) (⁾); Subscript 0 (₀); Subscript 1 (₁); Subscript 2 (₂); Subscript 3 (₃); Subscript 4 (₄); Subscript 5 (₅); Subscript 6 (₆); Subscript 7 (₇).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 7: Subscript 8 (₈); Subscript 9 (₉); Subscript + (₊); Subscript - (₋); Subscript ( (₍); Subscript ) (₎); Pseudo Question Mark (ỏ); Grave (ò); Acute (ó).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 8: Circumflex (ô); Tilde (õ); Macron (ō); Breve (ŏ); Superior Dot (ȯ); Umlaut (ö); Hacek (ǒ); Circle Above (o̊); Ligature left (o͡).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 9: Ligature right (o) ; High Comma off center (o̕); Double Acute (ő); Candrabindu (o̐); Cedilla (o̧); Right Hook (ǫ); Dot Below (ọ); Double Dot Below (o̤); Circle Below (o̥).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER COLUMN 10: Double Underscore (o̳); Underscore (o̲); Left Hook (o̦); Right Cedilla (o̜); Upadhmaniya (o̮); Double Tilde 1st half (o͠); Double Tilde 2nd half (o) ; High Comma centered (o̓).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">VOYAGER PC Keyboard: Spacing Circumflex (^); Spacing Underscore (_); Spacing Grave (`); Open Curly Bracket ({); Close Curly Bracket (}); Spacing Tilde (~).</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">Standard PC Keyboard: 1234567890-= !@#$%^&amp;*()_+ qwertyuiop[]\ QWERTYUIOP{}| asdfghjkl;' ASDFGHJKL:" zxcvbnm,./ ZXCVBNM&lt;&gt;?</subfield></datafield><datafield ind2=" " ind1=" " tag="500"><subfield code="a">Double Tilde, 1st and 2nd halves (o͠o) ; Ligature, both halves (o͡o).</subfield></datafield></record></collection>

View file

@ -0,0 +1,132 @@
beginRecord
format=MARC21
type=Bibliographic
leader=00000 M2.01200024 000h
LDR$$------M2.01200024------h
FMT$$MH
001$ 1$a[a=HT016424175]
002$a1$a[a=20100705]
026$ 1$a[a=HBZHT016424175]
030$$a|1uc||||||1|
036$a1$a[a=DE]
037$b1$a[a=lat]
050$$a|||||||||||||
051$$am||||||
070$ 1$a[a=575]
080$ 1$a[a=60]
100$ 1$9cdp[p=Hildegardis, c=Bingensis, d=1098-1179, 9=(DE-588)118550993]
101$ 1$dp[p=Hildegard, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Heilige, 1098-1179, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Sankt, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Sancta, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abbatissa, d=1098-1179]
101$ 1$cdp[p=Hildegarde, c=Sainte, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Monte Sancti Ruperti, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=die Heilige, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Bingen, d=1098-1179]
101$ 1$dp[p=Hildegardt, d=1098-1179]
101$ 1$dp[p=Hildegardis, d=1098-1179]
101$ 1$dp[p=Bingen, Hildegard <<von>>, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=of Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Sancta Abatissa, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=Santa, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=Sant', d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abbess, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Heilige, d=1098-1179]
101$ 1$cdp[p=Hildegarde, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=di Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abatissa, d=1098-1179]
101$ 1$cdp[p=Hildegarda, c=di Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegarda, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Bingeniläinen, d=1098-1179]
101$ 1$cdp[p=Childegard, c=ot Bingen, d=1098-1179]
101$ 1$dp[p=Bingen, Childegard <<ot>>, d=1098-1179]
101$ 1$dp[p=Bingen, Hildegarde <<de>>, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=von Bingen, d=1098-1179]
101$ 1$dp[p=Hildegardis von Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Sainte, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Alemannia, d=1098-1179]
104$b1$9bdp[p=Escot, Pozzi, d=1933-, b=[Bearb.], 9=(DE-588)128917687]
105$ 1$dp[p=Pozzi Escot, Olga, d=1933-]
304$b1$a[a=Unde quocumque]
331$ 1$a[a=Unde quocumque]
334$ 1$a[a=Musikdruck]
359$ 1$a[a=Hildegard von Bingen]
425$ 1$a[a=c 1994]
425$a1$a[a=1994]
503$a1$a[a=Transkription der mittelalterlichen Neumen in moderne Notation]
516$ 1$a[a=Melodien mit unterlegtem Text]
590$ 1$a[a=<<The>> Ursula Antiphons ... [Musikdruck]]
591$ 1$a[a=Hildegard von Bingen]
594$ 1$a[a=[Kassel]]
595$ 1$a[a=1994]
599$ 1$a[a=HT016424145]
SYS$$018117852
endRecord
beginRecord
format=MARC21
type=Bibliographic
leader=00000 M2.01200024 000h
LDR$$------M2.01200024------h
FMT$$MH
001$ 1$a[a=HT016424175]
002$a1$a[a=20100705]
026$ 1$a[a=HBZHT016424175]
030$$a|1uc||||||1|
036$a1$a[a=DE]
037$b1$a[a=lat]
050$$a|||||||||||||
051$$am||||||
070$ 1$a[a=575]
080$ 1$a[a=60]
100$ 1$9cdp[p=Hildegardis, c=Bingensis, d=1098-1179, 9=(DE-588)118550993]
101$ 1$dp[p=Hildegard, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Heilige, 1098-1179, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Sankt, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Sancta, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abbatissa, d=1098-1179]
101$ 1$cdp[p=Hildegarde, c=Sainte, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Monte Sancti Ruperti, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=die Heilige, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Bingen, d=1098-1179]
101$ 1$dp[p=Hildegardt, d=1098-1179]
101$ 1$dp[p=Hildegardis, d=1098-1179]
101$ 1$dp[p=Bingen, Hildegard <<von>>, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=of Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Sancta Abatissa, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=Santa, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=Sant', d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abbess, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Heilige, d=1098-1179]
101$ 1$cdp[p=Hildegarde, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=di Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abatissa, d=1098-1179]
101$ 1$cdp[p=Hildegarda, c=di Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegarda, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Bingeniläinen, d=1098-1179]
101$ 1$cdp[p=Childegard, c=ot Bingen, d=1098-1179]
101$ 1$dp[p=Bingen, Childegard <<ot>>, d=1098-1179]
101$ 1$dp[p=Bingen, Hildegarde <<de>>, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=von Bingen, d=1098-1179]
101$ 1$dp[p=Hildegardis von Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Sainte, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Alemannia, d=1098-1179]
104$b1$9bdp[p=Escot, Pozzi, d=1933-, b=[Bearb.], 9=(DE-588)128917687]
105$ 1$dp[p=Pozzi Escot, Olga, d=1933-]
304$b1$a[a=Unde quocumque]
331$ 1$a[a=Unde quocumque]
334$ 1$a[a=Musikdruck]
359$ 1$a[a=Hildegard von Bingen]
425$ 1$a[a=c 1994]
425$a1$a[a=1994]
503$a1$a[a=Transkription der mittelalterlichen Neumen in moderne Notation]
516$ 1$a[a=Melodien mit unterlegtem Text]
590$ 1$a[a=<<The>> Ursula Antiphons ... [Musikdruck]]
591$ 1$a[a=Hildegard von Bingen]
594$ 1$a[a=[Kassel]]
595$ 1$a[a=1994]
599$ 1$a[a=HT016424145]
SYS$$018117852
endRecord

View file

@ -0,0 +1,66 @@
beginRecord
format=MARC21
type=Bibliographic
leader=00000 M2.01200024 000h
LDR$$------M2.01200024------h
FMT$$MH
001$ 1$a[a=HT016424175]
002$a1$a[a=20100705]
026$ 1$a[a=HBZHT016424175]
030$$a|1uc||||||1|
036$a1$a[a=DE]
037$b1$a[a=lat]
050$$a|||||||||||||
051$$am||||||
070$ 1$a[a=575]
080$ 1$a[a=60]
100$ 1$9cdp[p=Hildegardis, c=Bingensis, d=1098-1179, 9=(DE-588)118550993]
101$ 1$dp[p=Hildegard, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Heilige, 1098-1179, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Sankt, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Sancta, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abbatissa, d=1098-1179]
101$ 1$cdp[p=Hildegarde, c=Sainte, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Monte Sancti Ruperti, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=die Heilige, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Bingen, d=1098-1179]
101$ 1$dp[p=Hildegardt, d=1098-1179]
101$ 1$dp[p=Hildegardis, d=1098-1179]
101$ 1$dp[p=Bingen, Hildegard <<von>>, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=of Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Sancta Abatissa, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=Santa, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=Sant', d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abbess, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Heilige, d=1098-1179]
101$ 1$cdp[p=Hildegarde, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Ildegarda, c=di Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=Abatissa, d=1098-1179]
101$ 1$cdp[p=Hildegarda, c=di Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegarda, c=de Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Bingeniläinen, d=1098-1179]
101$ 1$cdp[p=Childegard, c=ot Bingen, d=1098-1179]
101$ 1$dp[p=Bingen, Childegard <<ot>>, d=1098-1179]
101$ 1$dp[p=Bingen, Hildegarde <<de>>, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=von Bingen, d=1098-1179]
101$ 1$dp[p=Hildegardis von Bingen, d=1098-1179]
101$ 1$cdp[p=Hildegard, c=Sainte, d=1098-1179]
101$ 1$cdp[p=Hildegardis, c=de Alemannia, d=1098-1179]
104$b1$9bdp[p=Escot, Pozzi, d=1933-, b=[Bearb.], 9=(DE-588)128917687]
105$ 1$dp[p=Pozzi Escot, Olga, d=1933-]
304$b1$a[a=Unde quocumque]
331$ 1$a[a=Unde quocumque]
334$ 1$a[a=Musikdruck]
359$ 1$a[a=Hildegard von Bingen]
425$ 1$a[a=c 1994]
425$a1$a[a=1994]
503$a1$a[a=Transkription der mittelalterlichen Neumen in moderne Notation]
516$ 1$a[a=Melodien mit unterlegtem Text]
590$ 1$a[a=<<The>> Ursula Antiphons ... [Musikdruck]]
591$ 1$a[a=Hildegard von Bingen]
594$ 1$a[a=[Kassel]]
595$ 1$a[a=1994]
599$ 1$a[a=HT016424145]
SYS$$018117852
endRecord

View file

@ -1,6 +1,6 @@
{"index":{"_index":"testindex","_type":"testtype","_id":"(FR-PaOEC)6bee255b-ar"}} {"index":{"_index":"testindex","_type":"testtype","_id":"(FR-PaOEC)6bee255b-ar"}}
{"_FORMAT":"MabXML","_TYPE":"h","_LEADER":"00000 1000000 000 ","001":["(FR-PaOEC)6bee255b-ar"],"002":["20171208"],"004":["20171208"],"020":["(FR-PaOEC)6bee255b-ar<61>OECD"],"025":["6bee255b-ar"],"030":["a|zuc||||||37"],"037":["ara"],"050":["||||||||g|||||"],"051":["m|||||||"],"070":["OECD","HBZ"],"078":[{"e":[{"a":["ZDB-164-UNL","ZDB-164-UNL-ebook"]}]}],"200":["OHCHR"],"331":[{"_":[]}],"334":["Elektronische Ressource"],"359":["OHCHR"],"410":["New York"],"412":["United Nations"],"425":["2017"],"433":["75 p."],"540":["ISBN 9789210579391"],"552":["10.18356/6bee255b-ar"],"652":[{"a":[{"a":"Online-Ressource"}]}],"655":[{"e":[{"u":"http://dx.doi.org/10.18356/6bee255b-ar"},{"x":"Resolving-System"}]}],"775":[{"_":[{"i":"Parallelausgabe"},{"t":"Human Rights and Traditional Justice Systems in Africa"},{"z":"9789210579377"}]}]} {"_FORMAT":"MabXML","_TYPE":"h","_LEADER":"00000 1000000 000 ","001":["(FR-PaOEC)6bee255b-ar"],"002":["20171208"],"004":["20171208"],"020":["(FR-PaOEC)6bee255b-ar<61>OECD"],"025":["6bee255b-ar"],"030":["a|zuc||||||37"],"037":["ara"],"050":["||||||||g|||||"],"051":["m|||||||"],"070":["OECD","HBZ"],"078":[{"e":[{"a":["ZDB-164-UNL","ZDB-164-UNL-ebook"]}]}],"200":["OHCHR"],"331":[{" ":[]}],"334":["Elektronische Ressource"],"359":["OHCHR"],"410":["New York"],"412":["United Nations"],"425":["2017"],"433":["75 p."],"540":["ISBN 9789210579391"],"552":["10.18356/6bee255b-ar"],"652":[{"a":[{"a":"Online-Ressource"}]}],"655":[{"e":[{"u":"http://dx.doi.org/10.18356/6bee255b-ar"},{"x":"Resolving-System"}]}],"775":[{" ":[{"i":"Parallelausgabe"},{"t":"Human Rights and Traditional Justice Systems in Africa"},{"z":"9789210579377"}]}]}
{"index":{"_index":"testindex","_type":"testtype","_id":"(FR-PaOEC)6f8029f6-es"}} {"index":{"_index":"testindex","_type":"testtype","_id":"(FR-PaOEC)6f8029f6-es"}}
{"_FORMAT":"MabXML","_TYPE":"h","_LEADER":"00000 1000000 000 ","001":["(FR-PaOEC)6f8029f6-es"],"002":["20171208"],"004":["20171208"],"020":["(FR-PaOEC)6f8029f6-es<65>OECD"],"025":["6f8029f6-es"],"030":["a|zuc||||||37"],"037":["spa"],"050":["||||||||g|||||"],"051":["s|||||||"],"070":["OECD","HBZ"],"078":[{"e":[{"a":["ZDB-164-UNL","ZDB-164-UNL-ebook"]}]}],"200":["ECLAC"],"331":["Pol<6F>itica Industrial Rural y Fortalecimiento de Cadenas de Valor"],"334":["Elektronische Ressource"],"359":["ECLAC"],"410":["New York"],"412":["United Nations"],"425":["2017"],"433":["240 p."],"451":["ECLAC Books ; no.145"],"452":["2411-9385"],"540":["ISBN 9789210585897"],"552":["10.18356/6f8029f6-es"],"652":[{"a":[{"a":"Online-Ressource"}]}],"655":[{"e":[{"u":"http://dx.doi.org/10.18356/6f8029f6-es"},{"x":"Resolving-System"}]}]} {"_FORMAT":"MabXML","_TYPE":"h","_LEADER":"00000 1000000 000 ","001":["(FR-PaOEC)6f8029f6-es"],"002":["20171208"],"004":["20171208"],"020":["(FR-PaOEC)6f8029f6-es<65>OECD"],"025":["6f8029f6-es"],"030":["a|zuc||||||37"],"037":["spa"],"050":["||||||||g|||||"],"051":["s|||||||"],"070":["OECD","HBZ"],"078":[{"e":[{"a":["ZDB-164-UNL","ZDB-164-UNL-ebook"]}]}],"200":["ECLAC"],"331":["Pol<6F>itica Industrial Rural y Fortalecimiento de Cadenas de Valor"],"334":["Elektronische Ressource"],"359":["ECLAC"],"410":["New York"],"412":["United Nations"],"425":["2017"],"433":["240 p."],"451":["ECLAC Books ; no.145"],"452":["2411-9385"],"540":["ISBN 9789210585897"],"552":["10.18356/6f8029f6-es"],"652":[{"a":[{"a":"Online-Ressource"}]}],"655":[{"e":[{"u":"http://dx.doi.org/10.18356/6f8029f6-es"},{"x":"Resolving-System"}]}]}
{"index":{"_index":"testindex","_type":"testtype","_id":"(FR-PaOEC)c78e1213-ar"}} {"index":{"_index":"testindex","_type":"testtype","_id":"(FR-PaOEC)c78e1213-ar"}}
{"_FORMAT":"MabXML","_TYPE":"h","_LEADER":"00000 1000000 000 ","001":["(FR-PaOEC)c78e1213-ar"],"002":["20171208"],"004":["20171208"],"020":["(FR-PaOEC)c78e1213-ar<61>OECD"],"025":["c78e1213-ar"],"030":["a|zuc||||||37"],"037":["ara"],"050":["||||||||g|||||"],"051":["m|||||||"],"070":["OECD","HBZ"],"078":[{"e":[{"a":["ZDB-164-UNL","ZDB-164-UNL-ebook"]}]}],"200":["DESA"],"331":["2017"],"334":["Elektronische Ressource"],"359":["DESA"],"410":["New York"],"412":["United Nations"],"425":["2017"],"433":["62 p."],"540":["ISBN 9789213617182"],"552":["10.18356/c78e1213-ar"],"652":[{"a":[{"a":"Online-Ressource"}]}],"655":[{"e":[{"u":"http://dx.doi.org/10.18356/c78e1213-ar"},{"x":"Resolving-System"}]}],"775":[{"_":[{"i":"Parallelausgabe"},{"t":", 2017"},{"z":"9789213617205"}]},{"_":[{"i":"Parallelausgabe"},{"t":"2017"},{"z":"9789213617199"}]},{"_":[{"i":"Parallelausgabe"},{"t":"The Sustainable Development Goals Report 2017"},{"z":"9789213617151"}]},{"_":[{"i":"Parallelausgabe"},{"t":"Informe de los Objetivos de Desarrollo Sostenible 2017"},{"z":"9789213617175"}]},{"_":[{"i":"Parallelausgabe"},{"t":"Rapport sur les Objectifs de D<>eveloppement Durable 2017"},{"z":"9789213617168"}]}]} {"_FORMAT":"MabXML","_TYPE":"h","_LEADER":"00000 1000000 000 ","001":["(FR-PaOEC)c78e1213-ar"],"002":["20171208"],"004":["20171208"],"020":["(FR-PaOEC)c78e1213-ar<61>OECD"],"025":["c78e1213-ar"],"030":["a|zuc||||||37"],"037":["ara"],"050":["||||||||g|||||"],"051":["m|||||||"],"070":["OECD","HBZ"],"078":[{"e":[{"a":["ZDB-164-UNL","ZDB-164-UNL-ebook"]}]}],"200":["DESA"],"331":["2017"],"334":["Elektronische Ressource"],"359":["DESA"],"410":["New York"],"412":["United Nations"],"425":["2017"],"433":["62 p."],"540":["ISBN 9789213617182"],"552":["10.18356/c78e1213-ar"],"652":[{"a":[{"a":"Online-Ressource"}]}],"655":[{"e":[{"u":"http://dx.doi.org/10.18356/c78e1213-ar"},{"x":"Resolving-System"}]}],"775":[{" ":[{"i":"Parallelausgabe"},{"t":", 2017"},{"z":"9789213617205"}]},{" ":[{"i":"Parallelausgabe"},{"t":"2017"},{"z":"9789213617199"}]},{" ":[{"i":"Parallelausgabe"},{"t":"The Sustainable Development Goals Report 2017"},{"z":"9789213617151"}]},{" ":[{"i":"Parallelausgabe"},{"t":"Informe de los Objetivos de Desarrollo Sostenible 2017"},{"z":"9789213617175"}]},{" ":[{"i":"Parallelausgabe"},{"t":"Rapport sur les Objectifs de D<>eveloppement Durable 2017"},{"z":"9789213617168"}]}]}

View file

@ -0,0 +1,249 @@
<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd">
<ListRecords>
<record>
<header>
<identifier>aleph-publish:018117852</identifier>
</header>
<metadata>
<record xmlns="http://www.ddb.de/professionell/mabxml/mabxml-1.xsd">
<leader>------M2.01200024------h</leader>
<controlfield tag="LDR">------M2.01200024------h</controlfield>
<controlfield tag="FMT">MH</controlfield>
<datafield tag="001" ind1="-" ind2="1">
<subfield code="a">HT016424175</subfield>
</datafield>
<datafield tag="002" ind1="a" ind2="1">
<subfield code="a">20100705</subfield>
</datafield>
<datafield tag="026" ind1="-" ind2="1">
<subfield code="a">HBZHT016424175</subfield>
</datafield>
<controlfield tag="030">a|1uc||||||1|</controlfield>
<datafield tag="036" ind1="a" ind2="1">
<subfield code="a">DE</subfield>
</datafield>
<datafield tag="037" ind1="b" ind2="1">
<subfield code="a">lat</subfield>
</datafield>
<controlfield tag="050">a|||||||||||||</controlfield>
<controlfield tag="051">am||||||</controlfield>
<datafield tag="070" ind1="-" ind2="1">
<subfield code="a">575</subfield>
</datafield>
<datafield tag="080" ind1="-" ind2="1">
<subfield code="a">60</subfield>
</datafield>
<datafield tag="100" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">Bingensis</subfield>
<subfield code="d">1098-1179</subfield>
<subfield code="9">(DE-588)118550993</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="c">Heilige, 1098-1179</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="c">Sankt</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">Sancta</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">Abbatissa</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegarde</subfield>
<subfield code="c">Sainte</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Ildegarda</subfield>
<subfield code="c">de Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">de Monte Sancti Ruperti</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="c">die Heilige</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">de Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardt</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Bingen, Hildegard &lt;&lt;von>></subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="c">of Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">Sancta Abatissa</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Ildegarda</subfield>
<subfield code="c">Santa</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Ildegarda</subfield>
<subfield code="c">Sant'</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">Abbess</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="c">Heilige</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegarde</subfield>
<subfield code="c">de Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Ildegarda</subfield>
<subfield code="c">di Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">Abatissa</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegarda</subfield>
<subfield code="c">di Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegarda</subfield>
<subfield code="c">de Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="c">Bingeniläinen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Childegard</subfield>
<subfield code="c">ot Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Bingen, Childegard &lt;&lt;ot>></subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Bingen, Hildegarde &lt;&lt;de>></subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="c">von Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis von Bingen</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegard</subfield>
<subfield code="c">Sainte</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="101" ind1="-" ind2="1">
<subfield code="p">Hildegardis</subfield>
<subfield code="c">de Alemannia</subfield>
<subfield code="d">1098-1179</subfield>
</datafield>
<datafield tag="104" ind1="b" ind2="1">
<subfield code="p">Escot, Pozzi</subfield>
<subfield code="d">1933-</subfield>
<subfield code="b">[Bearb.]</subfield>
<subfield code="9">(DE-588)128917687</subfield>
</datafield>
<datafield tag="105" ind1="-" ind2="1">
<subfield code="p">Pozzi Escot, Olga</subfield>
<subfield code="d">1933-</subfield>
</datafield>
<datafield tag="304" ind1="b" ind2="1">
<subfield code="a">Unde quocumque</subfield>
</datafield>
<datafield tag="331" ind1="-" ind2="1">
<subfield code="a">Unde quocumque</subfield>
</datafield>
<datafield tag="334" ind1="-" ind2="1">
<subfield code="a">Musikdruck</subfield>
</datafield>
<datafield tag="359" ind1="-" ind2="1">
<subfield code="a">Hildegard von Bingen</subfield>
</datafield>
<datafield tag="425" ind1="-" ind2="1">
<subfield code="a">c 1994</subfield>
</datafield>
<datafield tag="425" ind1="a" ind2="1">
<subfield code="a">1994</subfield>
</datafield>
<datafield tag="503" ind1="a" ind2="1">
<subfield code="a">Transkription der mittelalterlichen Neumen in moderne Notation</subfield>
</datafield>
<datafield tag="516" ind1="-" ind2="1">
<subfield code="a">Melodien mit unterlegtem Text</subfield>
</datafield>
<datafield tag="590" ind1="-" ind2="1">
<subfield code="a">&lt;&lt;The>> Ursula Antiphons ... [Musikdruck]</subfield>
</datafield>
<datafield tag="591" ind1="-" ind2="1">
<subfield code="a">Hildegard von Bingen</subfield>
</datafield>
<datafield tag="594" ind1="-" ind2="1">
<subfield code="a">[Kassel]</subfield>
</datafield>
<datafield tag="595" ind1="-" ind2="1">
<subfield code="a">1994</subfield>
</datafield>
<datafield tag="599" ind1="-" ind2="1">
<subfield code="a">HT016424145</subfield>
</datafield>
<controlfield tag="SYS">018117852</controlfield>
</record>
</metadata>
</record>
</ListRecords>
</OAI-PMH>

View file

@ -1 +1 @@
{"_FORMAT":"MARC21","_TYPE":"Bibliographic","_LEADER":"00000 M2.01200024 000h","LDR":["------M2.01200024------h"],"FMT":["MH"],"001":[{"_1":[{"a":"HT016424175"}]}],"002":[{"a1":[{"a":"20100705"}]}],"026":[{"_1":[{"a":"HBZHT016424175"}]}],"030":["a|1uc||||||1|"],"036":[{"a1":[{"a":"DE"}]}],"037":[{"b1":[{"a":"lat"}]}],"050":["a|||||||||||||"],"051":["am||||||"],"070":[{"_1":[{"a":"575"}]}],"080":[{"_1":[{"a":"60"}]}],"100":[{"_1":[{"p":"Hildegardis"},{"c":"Bingensis"},{"d":"1098-1179"},{"9":"(DE-588)118550993"}]}],"101":[{"_1":[{"p":"Hildegard"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegard"},{"c":"Heilige, 1098-1179"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegard"},{"c":"Sankt"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"c":"Sancta"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"c":"Abbatissa"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegarde"},{"c":"Sainte"},{"d":"1098-1179"}]},{"_1":[{"p":"Ildegarda"},{"c":"de Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"c":"de Monte Sancti Ruperti"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegard"},{"c":"die Heilige"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"c":"de Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardt"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"d":"1098-1179"}]},{"_1":[{"p":"Bingen, Hildegard <<von>>"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegard"},{"c":"of Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"c":"Sancta Abatissa"},{"d":"1098-1179"}]},{"_1":[{"p":"Ildegarda"},{"c":"Santa"},{"d":"1098-1179"}]},{"_1":[{"p":"Ildegarda"},{"c":"Sant'"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"c":"Abbess"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegard"},{"c":"Heilige"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegarde"},{"c":"de Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Ildegarda"},{"c":"di Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"c":"Abatissa"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegarda"},{"c":"di Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegarda"},{"c":"de Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegard"},{"c":"Bingeniläinen"},{"d":"1098-1179"}]},{"_1":[{"p":"Childegard"},{"c":"ot Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Bingen, Childegard <<ot>>"},{"d":"1098-1179"}]},{"_1":[{"p":"Bingen, Hildegarde <<de>>"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegard"},{"c":"von Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis von Bingen"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegard"},{"c":"Sainte"},{"d":"1098-1179"}]},{"_1":[{"p":"Hildegardis"},{"c":"de Alemannia"},{"d":"1098-1179"}]}],"104":[{"b1":[{"p":"Escot, Pozzi"},{"d":"1933-"},{"b":"[Bearb.]"},{"9":"(DE-588)128917687"}]}],"105":[{"_1":[{"p":"Pozzi Escot, Olga"},{"d":"1933-"}]}],"304":[{"b1":[{"a":"Unde quocumque"}]}],"331":[{"_1":[{"a":"Unde quocumque"}]}],"334":[{"_1":[{"a":"Musikdruck"}]}],"359":[{"_1":[{"a":"Hildegard von Bingen"}]}],"425":[{"_1":[{"a":"c 1994"}]},{"a1":[{"a":"1994"}]}],"503":[{"a1":[{"a":"Transkription der mittelalterlichen Neumen in moderne Notation"}]}],"516":[{"_1":[{"a":"Melodien mit unterlegtem Text"}]}],"590":[{"_1":[{"a":"<<The>> Ursula Antiphons ... [Musikdruck]"}]}],"591":[{"_1":[{"a":"Hildegard von Bingen"}]}],"594":[{"_1":[{"a":"[Kassel]"}]}],"595":[{"_1":[{"a":"1994"}]}],"599":[{"_1":[{"a":"HT016424145"}]}],"SYS":["018117852"]} {"_FORMAT":"MARC21","_TYPE":"Bibliographic","_LEADER":"00000 M2.01200024 000h","LDR":["------M2.01200024------h"],"FMT":["MH"],"001":[{" 1":[{"a":"HT016424175"}]}],"002":[{"a1":[{"a":"20100705"}]}],"026":[{" 1":[{"a":"HBZHT016424175"}]}],"030":["a|1uc||||||1|"],"036":[{"a1":[{"a":"DE"}]}],"037":[{"b1":[{"a":"lat"}]}],"050":["a|||||||||||||"],"051":["am||||||"],"070":[{" 1":[{"a":"575"}]}],"080":[{" 1":[{"a":"60"}]}],"100":[{" 1":[{"p":"Hildegardis"},{"c":"Bingensis"},{"d":"1098-1179"},{"9":"(DE-588)118550993"}]}],"101":[{" 1":[{"p":"Hildegard"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Heilige, 1098-1179"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Sankt"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Sancta"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abbatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarde"},{"c":"Sainte"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Monte Sancti Ruperti"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"die Heilige"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardt"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Hildegard <<von>>"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"of Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Sancta Abatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"Santa"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"Sant'"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abbess"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Heilige"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarde"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Ildegarda"},{"c":"di Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"Abatissa"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarda"},{"c":"di Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegarda"},{"c":"de Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Bingeniläinen"},{"d":"1098-1179"}]},{" 1":[{"p":"Childegard"},{"c":"ot Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Childegard <<ot>>"},{"d":"1098-1179"}]},{" 1":[{"p":"Bingen, Hildegarde <<de>>"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"von Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis von Bingen"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegard"},{"c":"Sainte"},{"d":"1098-1179"}]},{" 1":[{"p":"Hildegardis"},{"c":"de Alemannia"},{"d":"1098-1179"}]}],"104":[{"b1":[{"p":"Escot, Pozzi"},{"d":"1933-"},{"b":"[Bearb.]"},{"9":"(DE-588)128917687"}]}],"105":[{" 1":[{"p":"Pozzi Escot, Olga"},{"d":"1933-"}]}],"304":[{"b1":[{"a":"Unde quocumque"}]}],"331":[{" 1":[{"a":"Unde quocumque"}]}],"334":[{" 1":[{"a":"Musikdruck"}]}],"359":[{" 1":[{"a":"Hildegard von Bingen"}]}],"425":[{" 1":[{"a":"c 1994"}]},{"a1":[{"a":"1994"}]}],"503":[{"a1":[{"a":"Transkription der mittelalterlichen Neumen in moderne Notation"}]}],"516":[{" 1":[{"a":"Melodien mit unterlegtem Text"}]}],"590":[{" 1":[{"a":"<<The>> Ursula Antiphons ... [Musikdruck]"}]}],"591":[{" 1":[{"a":"Hildegard von Bingen"}]}],"594":[{" 1":[{"a":"[Kassel]"}]}],"595":[{" 1":[{"a":"1994"}]}],"599":[{" 1":[{"a":"HT016424145"}]}],"SYS":["018117852"]}

View file

@ -0,0 +1 @@
01488cam 2200349 a 45000010009000000050017000090080041000269060045000679250044001129550188001560100017003440200033003610400018003940430012004120500025004240820016004491000021004652450078004862600038005643000021006026500052006236500035006756500030007106510030007406500024007706500026007946550029008206550027008498560097008768560075009738560090010481193987620041229190604.0000313s2000 nyu 000 1 eng  a7bcbccorignewd1eocipf20gy-gencatlg0 aacquireb2 shelf copiesxpolicy default ato HLCD pc03 03-13-00; lh08 to subj. 03-14-00; lh06 03-22-00; lk02 03-22-00; to Dewey 03-22-00; aa05 03-23-00; ps13 2001-11-06 bk rec'd, to CIP ver.fpv08 2001-11-07 CIP ver. to BCCD a 00029063  a0679450041 (acid-free paper) aDLCcDLCdDLC an-us-ny00aPS3553.H15bA82 200000a813/.542211 aChabon, Michael.14aThe amazing adventures of Kavalier and Clay :ba novel /cMichael Chabon. aNew York :bRandom House,cc2000. a639 p. ;c25 cm. 0aComic books, strips, etc.xAuthorshipvFiction. 0aHeroes in mass mediavFiction. 0aCzech AmericansvFiction. 0aNew York (N.Y.)vFiction. 0aYoung menvFiction. 0aCartoonistsvFiction. 7aHumorous stories.2gsafd 7aBildungsromane.2gsafd423Contributor biographical informationuhttp://www.loc.gov/catdir/bios/random052/00029063.html413Sample textuhttp://www.loc.gov/catdir/samples/random044/00029063.html423Publisher descriptionuhttp://www.loc.gov/catdir/description/random0411/00029063.html01185cam 2200301 a 45000010009000000050017000090080041000269060045000679250044001129550202001560100017003580200015003750200022003900400018004120420009004300500023004390820014004621000021004762450034004972500012005312600067005433000021006105200175006316500013008066500023008196500020008429520021008621288337620030616111422.0020805s2002 nyu j 000 1 eng  a7bcbccorignewd1eocipf20gy-gencatlg0 aacquireb2 shelf copiesxpolicy default apc14 2002-08-05 to HLCDclh08 2002-08-06 to subj.;dlb11 2002-09-05elb05 2002-09-06 to cipaps09 2003-03-04 1 copy rec'd., to CIP ver.fpv01 2003-03-17 CIP ver to BCCDald11 2003-05-12 cp2 to BCCD a 2002027497 a0786808772 a0786816155 (pbk.) aDLCcDLCdDLC alcac00aPZ7.C3315bSu 200200a[Fic]2211 aChabon, Michael.10aSummerland /cMichael Chabon. a1st ed. aNew York :bMiramax Books/Hyperion Books for Children,cc2002. a500 p. ;c22 cm. aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy. 1aFantasy. 1aBaseballvFiction. 1aMagicvFiction. aII lb11 09-05-02

View file

@ -1 +1 @@
[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01488cam 2200349 a 4500","001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"906":[{"__":[{"a":"7"},{"b":"cbc"},{"c":"orignew"},{"d":"1"},{"e":"ocip"},{"f":"20"},{"g":"y-gencatlg"}]}],"925":[{"0_":[{"a":"acquire"},{"b":"2 shelf copies"},{"x":"policy default"}]}],"955":[{"__":[{"a":"to HLCD pc03 03-13-00; lh08 to subj. 03-14-00; lh06 03-22-00; lk02 03-22-00; to Dewey 03-22-00; aa05 03-23-00; ps13 2001-11-06 bk rec'd, to CIP ver."},{"f":"pv08 2001-11-07 CIP ver. to BCCD"}]}],"010":[{"__":[{"a":" 00029063 "}]}],"020":[{"__":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{"__":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"043":[{"__":[{"a":"n-us-ny"}]}],"050":[{"00":[{"a":"PS3553.H15"},{"b":"A82 2000"}]}],"082":[{"00":[{"a":"813/.54"},{"2":"21"}]}],"100":[{"1_":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{"__":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{"__":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{"_0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{"_0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{"_0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{"_0":[{"a":"Young men"},{"v":"Fiction."}]},{"_0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{"_0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{"_7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{"_7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}],"856":[{"42":[{"3":"Contributor biographical information"},{"u":"http://www.loc.gov/catdir/bios/random052/00029063.html"}]},{"41":[{"3":"Sample text"},{"u":"http://www.loc.gov/catdir/samples/random044/00029063.html"}]},{"42":[{"3":"Publisher description"},{"u":"http://www.loc.gov/catdir/description/random0411/00029063.html"}]}]},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01185cam 2200301 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"906":[{"__":[{"a":"7"},{"b":"cbc"},{"c":"orignew"},{"d":"1"},{"e":"ocip"},{"f":"20"},{"g":"y-gencatlg"}]}],"925":[{"0_":[{"a":"acquire"},{"b":"2 shelf copies"},{"x":"policy default"}]}],"955":[{"__":[{"a":["pc14 2002-08-05 to HLCD","ps09 2003-03-04 1 copy rec'd., to CIP ver.","ld11 2003-05-12 cp2 to BCCD"]},{"c":"lh08 2002-08-06 to subj.;"},{"d":"lb11 2002-09-05"},{"e":"lb05 2002-09-06 to cip"},{"f":"pv01 2003-03-17 CIP ver to BCCD"}]}],"010":[{"__":[{"a":" 2002027497"}]}],"020":[{"__":[{"a":"0786808772"}]},{"__":[{"a":"0786816155 (pbk.)"}]}],"040":[{"__":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"042":[{"__":[{"a":"lcac"}]}],"050":[{"00":[{"a":"PZ7.C3315"},{"b":"Su 2002"}]}],"082":[{"00":[{"a":"[Fic]"},{"2":"21"}]}],"100":[{"1_":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{"__":[{"a":"1st ed."}]}],"260":[{"__":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{"__":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{"__":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{"_1":[{"a":"Fantasy."}]},{"_1":[{"a":"Baseball"},{"v":"Fiction."}]},{"_1":[{"a":"Magic"},{"v":"Fiction."}]}],"952":[{"__":[{"a":"II lb11 09-05-02"}]}]}] [{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01488cam 2200349 a 4500","001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"906":[{" ":[{"a":"7"},{"b":"cbc"},{"c":"orignew"},{"d":"1"},{"e":"ocip"},{"f":"20"},{"g":"y-gencatlg"}]}],"925":[{"0 ":[{"a":"acquire"},{"b":"2 shelf copies"},{"x":"policy default"}]}],"955":[{" ":[{"a":"to HLCD pc03 03-13-00; lh08 to subj. 03-14-00; lh06 03-22-00; lk02 03-22-00; to Dewey 03-22-00; aa05 03-23-00; ps13 2001-11-06 bk rec'd, to CIP ver."},{"f":"pv08 2001-11-07 CIP ver. to BCCD"}]}],"010":[{" ":[{"a":" 00029063 "}]}],"020":[{" ":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"043":[{" ":[{"a":"n-us-ny"}]}],"050":[{"00":[{"a":"PS3553.H15"},{"b":"A82 2000"}]}],"082":[{"00":[{"a":"813/.54"},{"2":"21"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{" ":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{" 0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{" 0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{" 0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{" 0":[{"a":"Young men"},{"v":"Fiction."}]},{" 0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{" 0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{" 7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{" 7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}],"856":[{"42":[{"3":"Contributor biographical information"},{"u":"http://www.loc.gov/catdir/bios/random052/00029063.html"}]},{"41":[{"3":"Sample text"},{"u":"http://www.loc.gov/catdir/samples/random044/00029063.html"}]},{"42":[{"3":"Publisher description"},{"u":"http://www.loc.gov/catdir/description/random0411/00029063.html"}]}]},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01185cam 2200301 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"906":[{" ":[{"a":"7"},{"b":"cbc"},{"c":"orignew"},{"d":"1"},{"e":"ocip"},{"f":"20"},{"g":"y-gencatlg"}]}],"925":[{"0 ":[{"a":"acquire"},{"b":"2 shelf copies"},{"x":"policy default"}]}],"955":[{" ":[{"a":["pc14 2002-08-05 to HLCD","ps09 2003-03-04 1 copy rec'd., to CIP ver.","ld11 2003-05-12 cp2 to BCCD"]},{"c":"lh08 2002-08-06 to subj.;"},{"d":"lb11 2002-09-05"},{"e":"lb05 2002-09-06 to cip"},{"f":"pv01 2003-03-17 CIP ver to BCCD"}]}],"010":[{" ":[{"a":" 2002027497"}]}],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"042":[{" ":[{"a":"lcac"}]}],"050":[{"00":[{"a":"PZ7.C3315"},{"b":"Su 2002"}]}],"082":[{"00":[{"a":"[Fic]"},{"2":"21"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}],"952":[{" ":[{"a":"II lb11 09-05-02"}]}]}]

View file

@ -0,0 +1 @@
00759cam a2200229 a 45000010009000000050017000090080041000260200033000670400018001001000021001182450078001392600038002173000021002556500052002766500035003286500030003636510030003936500024004236500026004476550029004736550027005021193987620041229190604.0000313s2000 nyu 000 1 eng  a0679450041 (acid-free paper) aDLCcDLCdDLC1 aChabon, Michael.14aThe amazing adventures of Kavalier and Clay :ba novel /cMichael Chabon. aNew York :bRandom House,cc2000. a639 p. ;c25 cm. 0aComic books, strips, etc.xAuthorshipvFiction. 0aHeroes in mass mediavFiction. 0aCzech AmericansvFiction. 0aNew York (N.Y.)vFiction. 0aYoung menvFiction. 0aCartoonistsvFiction. 7aHumorous stories.2gsafd 7aBildungsromane.2gsafd00714cam a2200205 a 45000010009000000050017000090080041000260200015000670200022000820400018001041000021001222450034001432500012001772600067001893000021002565200175002776500013004526500023004656500020004881288337620030616111422.0020805s2002 nyu j 000 1 eng  a0786808772 a0786816155 (pbk.) aDLCcDLCdDLC1 aChabon, Michael.10aSummerland /cMichael Chabon. a1st ed. aNew York :bMiramax Books/Hyperion Books for Children,cc2002. a500 p. ;c22 cm. aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy. 1aFantasy. 1aBaseballvFiction. 1aMagicvFiction.

View file

@ -1 +1 @@
[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00759cam a2200229 a 4500","001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"020":[{"__":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{"__":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1_":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{"__":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{"__":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{"_0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{"_0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{"_0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{"_0":[{"a":"Young men"},{"v":"Fiction."}]},{"_0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{"_0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{"_7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{"_7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}]},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{"__":[{"a":"0786808772"}]},{"__":[{"a":"0786816155 (pbk.)"}]}],"040":[{"__":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1_":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{"__":[{"a":"1st ed."}]}],"260":[{"__":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{"__":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{"__":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{"_1":[{"a":"Fantasy."}]},{"_1":[{"a":"Baseball"},{"v":"Fiction."}]},{"_1":[{"a":"Magic"},{"v":"Fiction."}]}]}] [{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00759cam a2200229 a 4500","001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"020":[{" ":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{" ":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{" 0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{" 0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{" 0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{" 0":[{"a":"Young men"},{"v":"Fiction."}]},{" 0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{" 0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{" 7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{" 7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}]},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}]}]

View file

@ -1,2 +1,2 @@
[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{"__":[{"a":"0786808772"}]},{"__":[{"a":"0786816155 (pbk.)"}]}],"040":[{"__":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1_":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{"__":[{"a":"1st ed."}]}],"260":[{"__":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{"__":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{"__":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{"_1":[{"a":"Fantasy."}]},{"_1":[{"a":"Baseball"},{"v":"Fiction."}]},{"_1":[{"a":"Magic"},{"v":"Fiction."}]}]} [{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}]}
,{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00759cam a2200229 a 4500","001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"020":[{"__":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{"__":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1_":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{"__":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{"__":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{"_0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{"_0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{"_0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{"_0":[{"a":"Young men"},{"v":"Fiction."}]},{"_0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{"_0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{"_7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{"_7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}]},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{"__":[{"a":"0786808772"}]},{"__":[{"a":"0786816155 (pbk.)"}]}],"040":[{"__":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1_":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{"__":[{"a":"1st ed."}]}],"260":[{"__":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{"__":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{"__":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{"_1":[{"a":"Fantasy."}]},{"_1":[{"a":"Baseball"},{"v":"Fiction."}]},{"_1":[{"a":"Magic"},{"v":"Fiction."}]}]}] ,{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00759cam a2200229 a 4500","001":["11939876"],"005":["20041229190604.0"],"008":["000313s2000 nyu 000 1 eng "],"020":[{" ":[{"a":"0679450041 (acid-free paper)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"14":[{"a":"The amazing adventures of Kavalier and Clay :"},{"b":"a novel /"},{"c":"Michael Chabon."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Random House,"},{"c":"c2000."}]}],"300":[{" ":[{"a":"639 p. ;"},{"c":"25 cm."}]}],"650":[{" 0":[{"a":"Comic books, strips, etc."},{"x":"Authorship"},{"v":"Fiction."}]},{" 0":[{"a":"Heroes in mass media"},{"v":"Fiction."}]},{" 0":[{"a":"Czech Americans"},{"v":"Fiction."}]},{" 0":[{"a":"Young men"},{"v":"Fiction."}]},{" 0":[{"a":"Cartoonists"},{"v":"Fiction."}]}],"651":[{" 0":[{"a":"New York (N.Y.)"},{"v":"Fiction."}]}],"655":[{" 7":[{"a":"Humorous stories."},{"2":"gsafd"}]},{" 7":[{"a":"Bildungsromane."},{"2":"gsafd"}]}]},{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}]}]

View file

@ -0,0 +1 @@
00937ndm a2200253 u 4500001001000000003000700010005001700017031008500034031003900119031003900158031004200197040001100239100004900250240004100299245002000340300002000360500011000380504002300490593001900513594001500532650001700547852002800564856009100592190101037DE-63320170526171907.0 a1b1c1dLargogG-2mvlo3/2p2-4.8''E'EA''C/2'B4.8''E'EB''D/2Crau302267692pe a1b2c1dVivaceo3/4u302267702pe a1b3c1dAdagioo3/2u302267712pe a1b4c1dNon prestooc/u302267722pe aDE-6331 aRoman, Johan Helmichd1694-1758je03000272910aSonatasmvl (2), bcnBenR T11.107ra10a[without title] ascore: 4f.81\c aThumb Ro 51 (32): http://muscat.rism.info/system/digital_objects/attachments/000/000/044/original/308.jpg aBenRbT11.1070265 aautograph81\c avl (2), bc00aTrio sonatas aS-SkmacRo 51x3000215340uhttp://www.muslib.se/ebibliotek/roman/browsevol.php?lang=en&by=volymid&volymid=Ro+51z

View file

@ -1 +1 @@
[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00937ndm a2200253 u 4500","001":["190101037"],"003":["DE-633"],"005":["20170526171907.0"],"031":[{"__":[{"a":"1"},{"b":"1"},{"c":"1"},{"d":"Largo"},{"g":"G-2"},{"m":"vl"},{"o":"3/2"},{"p":"2-4.8''E'EA''C/2'B4.8''E'EB''D/2C"},{"r":"a"},{"u":"30226769"},{"2":"pe"}]},{"__":[{"a":"1"},{"b":"2"},{"c":"1"},{"d":"Vivace"},{"o":"3/4"},{"u":"30226770"},{"2":"pe"}]},{"__":[{"a":"1"},{"b":"3"},{"c":"1"},{"d":"Adagio"},{"o":"3/2"},{"u":"30226771"},{"2":"pe"}]},{"__":[{"a":"1"},{"b":"4"},{"c":"1"},{"d":"Non presto"},{"o":"c/"},{"u":"30226772"},{"2":"pe"}]}],"040":[{"__":[{"a":"DE-633"}]}],"100":[{"1_":[{"a":"Roman, Johan Helmich"},{"d":"1694-1758"},{"j":"e"},{"0":"30002729"}]}],"240":[{"10":[{"a":"Sonatas"},{"m":"vl (2), bc"},{"n":"BenR T11.107"},{"r":"a"}]}],"245":[{"10":[{"a":"[without title]"}]}],"300":[{"__":[{"a":"score: 4f."},{"8":"1\\c"}]}],"500":[{"__":[{"a":"Thumb Ro 51 (32): http://muscat.rism.info/system/digital_objects/attachments/000/000/044/original/308.jpg"}]}],"504":[{"__":[{"a":"BenR"},{"b":"T11.107"},{"0":"265"}]}],"593":[{"__":[{"a":"autograph"},{"8":"1\\c"}]}],"594":[{"__":[{"a":"vl (2), bc"}]}],"650":[{"00":[{"a":"Trio sonatas"}]}],"852":[{"__":[{"a":"S-Skma"},{"c":"Ro 51"},{"x":"30002153"}]}],"856":[{"40":[{"u":"http://www.muslib.se/ebibliotek/roman/browsevol.php?lang=en&by=volymid&volymid=Ro+51"},{"z":""}]}]}] [{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00937ndm a2200253 u 4500","001":["190101037"],"003":["DE-633"],"005":["20170526171907.0"],"031":[{" ":[{"a":"1"},{"b":"1"},{"c":"1"},{"d":"Largo"},{"g":"G-2"},{"m":"vl"},{"o":"3/2"},{"p":"2-4.8''E'EA''C/2'B4.8''E'EB''D/2C"},{"r":"a"},{"u":"30226769"},{"2":"pe"}]},{" ":[{"a":"1"},{"b":"2"},{"c":"1"},{"d":"Vivace"},{"o":"3/4"},{"u":"30226770"},{"2":"pe"}]},{" ":[{"a":"1"},{"b":"3"},{"c":"1"},{"d":"Adagio"},{"o":"3/2"},{"u":"30226771"},{"2":"pe"}]},{" ":[{"a":"1"},{"b":"4"},{"c":"1"},{"d":"Non presto"},{"o":"c/"},{"u":"30226772"},{"2":"pe"}]}],"040":[{" ":[{"a":"DE-633"}]}],"100":[{"1 ":[{"a":"Roman, Johan Helmich"},{"d":"1694-1758"},{"j":"e"},{"0":"30002729"}]}],"240":[{"10":[{"a":"Sonatas"},{"m":"vl (2), bc"},{"n":"BenR T11.107"},{"r":"a"}]}],"245":[{"10":[{"a":"[without title]"}]}],"300":[{" ":[{"a":"score: 4f."},{"8":"1\\c"}]}],"500":[{" ":[{"a":"Thumb Ro 51 (32): http://muscat.rism.info/system/digital_objects/attachments/000/000/044/original/308.jpg"}]}],"504":[{" ":[{"a":"BenR"},{"b":"T11.107"},{"0":"265"}]}],"593":[{" ":[{"a":"autograph"},{"8":"1\\c"}]}],"594":[{" ":[{"a":"vl (2), bc"}]}],"650":[{"00":[{"a":"Trio sonatas"}]}],"852":[{" ":[{"a":"S-Skma"},{"c":"Ro 51"},{"x":"30002153"}]}],"856":[{"40":[{"u":"http://www.muslib.se/ebibliotek/roman/browsevol.php?lang=en&by=volymid&volymid=Ro+51"},{"z":""}]}]}]

View file

@ -0,0 +1 @@
00714cam a2200205 a 45000010009000000050017000090080041000260200015000670200022000820400018001041000021001222450034001432500012001772600067001893000021002565200175002776500013004526500023004656500020004881288337620030616111422.0020805s2002 nyu j 000 1 eng  a0786808772 a0786816155 (pbk.) aDLCcDLCdDLC1 aChabon, Michael.10aSummerland /cMichael Chabon. a1st ed. aNew York :bMiramax Books/Hyperion Books for Children,cc2002. a500 p. ;c22 cm. aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy. 1aFantasy. 1aBaseballvFiction. 1aMagicvFiction.

View file

@ -1 +1 @@
[{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{"__":[{"a":"0786808772"}]},{"__":[{"a":"0786816155 (pbk.)"}]}],"040":[{"__":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1_":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{"__":[{"a":"1st ed."}]}],"260":[{"__":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{"__":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{"__":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{"_1":[{"a":"Fantasy."}]},{"_1":[{"a":"Baseball"},{"v":"Fiction."}]},{"_1":[{"a":"Magic"},{"v":"Fiction."}]}]}] [{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00714cam a2200205 a 4500","001":["12883376"],"005":["20030616111422.0"],"008":["020805s2002 nyu j 000 1 eng "],"020":[{" ":[{"a":"0786808772"}]},{" ":[{"a":"0786816155 (pbk.)"}]}],"040":[{" ":[{"a":"DLC"},{"c":"DLC"},{"d":"DLC"}]}],"100":[{"1 ":[{"a":"Chabon, Michael."}]}],"245":[{"10":[{"a":"Summerland /"},{"c":"Michael Chabon."}]}],"250":[{" ":[{"a":"1st ed."}]}],"260":[{" ":[{"a":"New York :"},{"b":"Miramax Books/Hyperion Books for Children,"},{"c":"c2002."}]}],"300":[{" ":[{"a":"500 p. ;"},{"c":"22 cm."}]}],"520":[{" ":[{"a":"Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy."}]}],"650":[{" 1":[{"a":"Fantasy."}]},{" 1":[{"a":"Baseball"},{"v":"Fiction."}]},{" 1":[{"a":"Magic"},{"v":"Fiction."}]}]}]

View file

@ -0,0 +1 @@
04427cam a2201081 c45000010012000000030007000120050017000190070003000360080041000390150016000800160023000960200054001190200061001730240018002340350022002520350023002740350026002970350023003230400029003460410008003750440013003830820013003960840012004091000104004212450468005252500015009932640049010082640012010573000022010693360026010913370046011173380025011636550081011886890092012696890077013616890091014386890013015296890092015426890079016346890013017137000105017267000124018317000064019557730054020198560132020738560120022059820025023259690015023509830019023659690006023849820023023909840011024139830020024249840006024449000026024509000022024769000028024989000030025269000027025569000020025839000020026039000029026239000020026529000027026729000030026999000025027299000036027549500026027909500025028169500013028419500016028549500026028709500042028969500015029389500019029539500017029729500024029899500024030139500022030379500021030599500022030809500011031029500025031139510010031389510010031489510010031589510007031688520032031758520034032078520032032418520032032739800040033050-730849546DE-62720190704100209.0tu121203s2019 xx ||||| 00| ||ger c a12,N482dnb7 a10281626692DE-101 a3579026895cGb.ca. EUR 168.00 (DE)93-579-02689-5 a9783579026893cGb.ca. EUR 168.00 (DE)9978-3-579-02689-33 a9783579026893 a(DE-627)730849546 a(DE-576)9730849544 a(DE-599)DNB1028162669 a(DE-101)1028162669 aDE-627bgercDE-627erda ager cXA-DE-NW04a290qDNB a12ssgn1 aBuber, Martind1878-1965eVerfasserIn0(DE-588)1185164770(DE-627)1333991090(DE-576)2088770884aut10aWerkausgaben13pSchriften zur biblischen Religion / herausgegeben von Christian Wiese unter Mitarbeit von Heike Breitenbach ; eingeleitet von Michael Fishbane ; kommentiert von Christian Wiese und Heike Breitenbach unter Mitarbeit von Andreas Loschn1pTextcMartin Buber ; im Auftrag der Philosophischen Fakultät der Heinrich Heine Universität Düsseldorf und der Israel Acadademy of Sciences and Humanities herausgegeben von Paul Mendes-Flohr und Bernd Witte a1. Auflage 1aGüterslohbGütersloher Verlagshausc[2019] 4c© 2019 a726 Seitenc23 cm aTextbtxt2rdacontent aohne Hilfsmittel zu benutzenbn2rdamedia aBandbnc2rdacarrier 7aQuelle0(DE-588)4135952-50(DE-627)1056612360(DE-576)2096650842gnd-content00Du0(DE-588)4001515-40(DE-627)1046036660(DE-576)208843116aBibelpAltes Testament2gnd01Ds0(DE-588)4015950-40(DE-627)1046753140(DE-576)20891434XaExegese2gnd02Ds0(DE-588)4136677-30(DE-627)1056557400(DE-576)209671181aJüdische Philosophie2gnd0 5(DE-627)10Du0(DE-588)4001515-40(DE-627)1046036660(DE-576)208843116aBibelpAltes Testament2gnd11Ds0(DE-588)4059758-10(DE-627)1041314460(DE-576)209132159aTheologie2gnd1 5(DE-627)1 aWiese, Christiand1961-eHerausgeberIn0(DE-588)1214519170(DE-627)0813170690(DE-576)1812949584edt1 aFishbane, Michael A.d1943-eVerfasserIn einer Einleitung0(DE-588)1313998370(DE-627)50877294X0(DE-576)1787759164win1 aBuber, Martind1878-1965tSchriften zur biblischen Religion18w(DE-627)1165587912w(DE-576)095587918g13,1q13,142uhttp://deposit.d-nb.de/cgi-bin/dokserv?id=4186947&prov=M&dok_var=1&dok_ext=htmnVerlag: MVBqtext/htmlv2013-05-013Inhaltstext42uhttp://swbplus.bsz-bw.de/bsz730849546inh.htmmV:DE-576;B:DE-21qapplication/pdfv201906051551003Inhaltsverzeichnis a(DE-15)0025681716x1 bFHTheolx1 a(DE-15)3717597 cB a(DE-14)34144552x1 bFH1x1 a(DE-14)16659087 cB aPYŠBYYN, Mîkāʿēl aFishbane, Michael aFišbeyn, Mîḵāʾēl aBūber, Mordekaj Marṭin aBuber, Martin Mordehai aBuber, Marṭin aMpumper, Martin aBûber, Mordekay Martîn aBūbā, Marutin aBuber, Mordehai Martin aBuber, Mordekhai Marṭin ובר, מרטין ובר, מרדכי מרטין aChristliche Theologie огословие aJudentum aPhilosophie aÖstliche Philosophie удейская философия aAlter Bund aBibelauslegung aBibelexegese aBiblische Auslegung aBibelinterpretation aBiblische Exegese aSchriftauslegung aBibelwissenschaft aExeget aЭкзегетика bXA-AT bXA-DE bXB-IL bXY aDE-14z2019-05-06T09:35:35Z aDE-L325z2019-05-28T10:02:58Z aDE-16z2019-05-15T10:23:35Z aDE-15z2019-05-09T09:13:04Z a730849546b0k730849546o9730849544

File diff suppressed because one or more lines are too long

View file

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<collection xmlns="info:lc/xmlns/marcxchange-v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd"> <collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<record format="MARC21" type="Bibliographic"> <record format="MARC21" type="Bibliographic">
<leader>01685cam a2200421Ia 4500</leader> <leader>01685cam a2200421Ia 4500</leader>
<controlfield tag="001">ocm63111280 </controlfield> <controlfield tag="001">ocm63111280 </controlfield>
<controlfield tag="003">OCoLC</controlfield> <controlfield tag="003">OCoLC</controlfield>
<controlfield tag="005">20150710113452.0</controlfield> <controlfield tag="005">20150710113452.0</controlfield>
<controlfield tag="008">060119s2005 ch a b 000 0 chi d</controlfield> <controlfield tag="008">060119s2005 ch a b 000 0 chi d</controlfield>
<datafield tag="040" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="040">
<subfield code="a">KKU</subfield> <subfield code="a">KKU</subfield>
<subfield code="b">eng</subfield> <subfield code="b">eng</subfield>
<subfield code="c">KKU</subfield> <subfield code="c">KKU</subfield>
@ -15,131 +15,131 @@
<subfield code="d">OCLCO</subfield> <subfield code="d">OCLCO</subfield>
<subfield code="d">OCLCQ</subfield> <subfield code="d">OCLCQ</subfield>
</datafield> </datafield>
<datafield tag="020" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="020">
<subfield code="a">9867271033</subfield> <subfield code="a">9867271033</subfield>
</datafield> </datafield>
<datafield tag="020" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="020">
<subfield code="a">9789867271037</subfield> <subfield code="a">9789867271037</subfield>
</datafield> </datafield>
<datafield tag="029" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="029">
<subfield code="a">GEBAY</subfield> <subfield code="a">GEBAY</subfield>
<subfield code="b">10724576</subfield> <subfield code="b">10724576</subfield>
</datafield> </datafield>
<datafield tag="035" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="035">
<subfield code="a">(OCoLC)63111280</subfield> <subfield code="a">(OCoLC)63111280</subfield>
</datafield> </datafield>
<datafield tag="043" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="043">
<subfield code="a">a-ja---</subfield> <subfield code="a">a-ja---</subfield>
<subfield code="a">a-cc---</subfield> <subfield code="a">a-cc---</subfield>
</datafield> </datafield>
<datafield tag="050" ind1=" " ind2="4"> <datafield ind2="4" ind1=" " tag="050">
<subfield code="a">DS821.5.C5</subfield> <subfield code="a">DS821.5.C5</subfield>
<subfield code="b">Y4 2005</subfield> <subfield code="b">Y4 2005</subfield>
</datafield> </datafield>
<datafield tag="049" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="049">
<subfield code="a">VA@@</subfield> <subfield code="a">VA@@</subfield>
</datafield> </datafield>
<datafield tag="100" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="100">
<subfield code="6">880-01</subfield> <subfield code="6">880-01</subfield>
<subfield code="a">Ye, Hanao,</subfield> <subfield code="a">Ye, Hanao,</subfield>
<subfield code="d">1952-</subfield> <subfield code="d">1952-</subfield>
</datafield> </datafield>
<datafield tag="245" ind1="1" ind2="0"> <datafield ind2="0" ind1="1" tag="245">
<subfield code="6">880-02</subfield> <subfield code="6">880-02</subfield>
<subfield code="a">Riben min su, xin yang, yi neng, yu Zhongguo wen hua /</subfield> <subfield code="a">Riben min su, xin yang, yi neng, yu Zhongguo wen hua /</subfield>
<subfield code="c">Ye Hanao zhu.</subfield> <subfield code="c">Ye Hanao zhu.</subfield>
</datafield> </datafield>
<datafield tag="260" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="260">
<subfield code="6">880-03</subfield> <subfield code="6">880-03</subfield>
<subfield code="a">Taibei Shi :</subfield> <subfield code="a">Taibei Shi :</subfield>
<subfield code="b">Da xin shu ju,</subfield> <subfield code="b">Da xin shu ju,</subfield>
<subfield code="c">[2005]</subfield> <subfield code="c">[2005]</subfield>
</datafield> </datafield>
<datafield tag="300" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="300">
<subfield code="a">5, xiv, 332 pages :</subfield> <subfield code="a">5, xiv, 332 pages :</subfield>
<subfield code="b">illustrations (some color) ;</subfield> <subfield code="b">illustrations (some color) ;</subfield>
<subfield code="c">21 cm</subfield> <subfield code="c">21 cm</subfield>
</datafield> </datafield>
<datafield tag="336" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="336">
<subfield code="a">text</subfield> <subfield code="a">text</subfield>
<subfield code="b">txt</subfield> <subfield code="b">txt</subfield>
<subfield code="2">rdacontent</subfield> <subfield code="2">rdacontent</subfield>
</datafield> </datafield>
<datafield tag="337" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="337">
<subfield code="a">unmediated</subfield> <subfield code="a">unmediated</subfield>
<subfield code="b">n</subfield> <subfield code="b">n</subfield>
<subfield code="2">rdamedia</subfield> <subfield code="2">rdamedia</subfield>
</datafield> </datafield>
<datafield tag="338" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="338">
<subfield code="a">volume</subfield> <subfield code="a">volume</subfield>
<subfield code="b">nc</subfield> <subfield code="b">nc</subfield>
<subfield code="2">rdacarrier</subfield> <subfield code="2">rdacarrier</subfield>
</datafield> </datafield>
<datafield tag="504" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="504">
<subfield code="a">Includes bibliographical references.</subfield> <subfield code="a">Includes bibliographical references.</subfield>
</datafield> </datafield>
<datafield tag="651" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="651">
<subfield code="a">Japan</subfield> <subfield code="a">Japan</subfield>
<subfield code="x">Social life and customs.</subfield> <subfield code="x">Social life and customs.</subfield>
</datafield> </datafield>
<datafield tag="651" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="651">
<subfield code="a">China</subfield> <subfield code="a">China</subfield>
<subfield code="x">Social life and customs.</subfield> <subfield code="x">Social life and customs.</subfield>
</datafield> </datafield>
<datafield tag="651" ind1=" " ind2="0"> <datafield ind2="0" ind1=" " tag="651">
<subfield code="a">Japan</subfield> <subfield code="a">Japan</subfield>
<subfield code="x">Civilization</subfield> <subfield code="x">Civilization</subfield>
<subfield code="x">Chinese influences.</subfield> <subfield code="x">Chinese influences.</subfield>
</datafield> </datafield>
<datafield tag="650" ind1=" " ind2="7"> <datafield ind2="7" ind1=" " tag="650">
<subfield code="a">Civilization</subfield> <subfield code="a">Civilization</subfield>
<subfield code="x">Chinese influences.</subfield> <subfield code="x">Chinese influences.</subfield>
<subfield code="2">fast</subfield> <subfield code="2">fast</subfield>
<subfield code="0">(OCoLC)fst00862903</subfield> <subfield code="0">(OCoLC)fst00862903</subfield>
</datafield> </datafield>
<datafield tag="650" ind1=" " ind2="7"> <datafield ind2="7" ind1=" " tag="650">
<subfield code="a">Manners and customs.</subfield> <subfield code="a">Manners and customs.</subfield>
<subfield code="2">fast</subfield> <subfield code="2">fast</subfield>
<subfield code="0">(OCoLC)fst01007815</subfield> <subfield code="0">(OCoLC)fst01007815</subfield>
</datafield> </datafield>
<datafield tag="651" ind1=" " ind2="7"> <datafield ind2="7" ind1=" " tag="651">
<subfield code="a">China.</subfield> <subfield code="a">China.</subfield>
<subfield code="2">fast</subfield> <subfield code="2">fast</subfield>
<subfield code="0">(OCoLC)fst01206073</subfield> <subfield code="0">(OCoLC)fst01206073</subfield>
</datafield> </datafield>
<datafield tag="651" ind1=" " ind2="7"> <datafield ind2="7" ind1=" " tag="651">
<subfield code="a">Japan.</subfield> <subfield code="a">Japan.</subfield>
<subfield code="2">fast</subfield> <subfield code="2">fast</subfield>
<subfield code="0">(OCoLC)fst01204082</subfield> <subfield code="0">(OCoLC)fst01204082</subfield>
</datafield> </datafield>
<datafield tag="776" ind1="0" ind2="8"> <datafield ind2="8" ind1="0" tag="776">
<subfield code="i">Online version:</subfield> <subfield code="i">Online version:</subfield>
<subfield code="a">Ye, Hanao, 1952-</subfield> <subfield code="a">Ye, Hanao, 1952-</subfield>
<subfield code="t">Riben min su, xin yang, yi neng, yu Zhongguo wen hua.</subfield> <subfield code="t">Riben min su, xin yang, yi neng, yu Zhongguo wen hua.</subfield>
<subfield code="d">Taibei Shi : Da xin shu ju, [2005]</subfield> <subfield code="d">Taibei Shi : Da xin shu ju, [2005]</subfield>
<subfield code="w">(OCoLC)654474548</subfield> <subfield code="w">(OCoLC)654474548</subfield>
</datafield> </datafield>
<datafield tag="880" ind1="1" ind2=" "> <datafield ind2=" " ind1="1" tag="880">
<subfield code="6">100-01</subfield> <subfield code="6">100-01</subfield>
<subfield code="a">葉漢鰲,</subfield> <subfield code="a">葉漢鰲,</subfield>
<subfield code="d">1952-</subfield> <subfield code="d">1952-</subfield>
</datafield> </datafield>
<datafield tag="880" ind1="1" ind2="0"> <datafield ind2="0" ind1="1" tag="880">
<subfield code="6">245-02</subfield> <subfield code="6">245-02</subfield>
<subfield code="a">日本民俗·信仰·藝能·與中國文化 /</subfield> <subfield code="a">日本民俗·信仰·藝能·與中國文化 /</subfield>
<subfield code="c">葉漢鰲著.</subfield> <subfield code="c">葉漢鰲著.</subfield>
</datafield> </datafield>
<datafield tag="880" ind1="1" ind2="4"> <datafield ind2="4" ind1="1" tag="880">
<subfield code="6">246-00</subfield> <subfield code="6">246-00</subfield>
<subfield code="a">日本民俗信仰藝能與中國文化</subfield> <subfield code="a">日本民俗信仰藝能與中國文化</subfield>
</datafield> </datafield>
<datafield tag="880" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="880">
<subfield code="6">260-03</subfield> <subfield code="6">260-03</subfield>
<subfield code="a">台北市 :</subfield> <subfield code="a">台北市 :</subfield>
<subfield code="b">大新書局,</subfield> <subfield code="b">大新書局,</subfield>
<subfield code="c">[2005]</subfield> <subfield code="c">[2005]</subfield>
</datafield> </datafield>
<datafield tag="994" ind1=" " ind2=" "> <datafield ind2=" " ind1=" " tag="994">
<subfield code="a">C0</subfield> <subfield code="a">C0</subfield>
<subfield code="b">VA@</subfield> <subfield code="b">VA@</subfield>
</datafield> </datafield>

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8"?><record xmlns="http://www.loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd">
<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd" xmlns="http://www.loc.gov/MARC21/slim">
<leader>00714cam a2200205 a 4500</leader> <leader>00714cam a2200205 a 4500</leader>
<controlfield tag="001">12883376</controlfield> <controlfield tag="001">12883376</controlfield>
<controlfield tag="005">20030616111422.0</controlfield> <controlfield tag="005">20030616111422.0</controlfield>

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/mods/v3" version="3.6" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-6.xsd"> <?xml version="1.0" encoding="UTF-8"?><mods xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-6.xsd" version="3.6">
<titleInfo> <titleInfo>
<title>Summerland</title> <title>Summerland</title>
</titleInfo> </titleInfo>
@ -20,7 +20,7 @@
<issuance>monographic</issuance> <issuance>monographic</issuance>
</originInfo> </originInfo>
<language> <language>
<languageTerm authority="iso639-2b" type="code">eng</languageTerm> <languageTerm type="code" authority="iso639-2b">eng</languageTerm>
</language> </language>
<physicalDescription> <physicalDescription>
<form authority="marcform">print</form> <form authority="marcform">print</form>

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><mods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.loc.gov/mods/v3" version="3.6" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-6.xsd"> <?xml version="1.0" encoding="UTF-8"?><mods xmlns="http://www.loc.gov/mods/v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-6.xsd" version="3.6">
<titleInfo> <titleInfo>
<title>Summerland</title> <title>Summerland</title>
</titleInfo> </titleInfo>
@ -20,7 +20,7 @@
<issuance>monographic</issuance> <issuance>monographic</issuance>
</originInfo> </originInfo>
<language> <language>
<languageTerm authority="iso639-2b" type="code">eng</languageTerm> <languageTerm type="code" authority="iso639-2b">eng</languageTerm>
</language> </language>
<physicalDescription> <physicalDescription>
<form authority="marcform">print</form> <form authority="marcform">print</form>

View file

@ -0,0 +1 @@
00714cam a2200205 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC1001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction.

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd"><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0786808772</subfield></datafield><datafield tag="020" ind1=" " ind2=" "><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield tag="040" ind1=" " ind2=" "><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield tag="100" ind1="1" ind2=" "><subfield code="a">Chabon, Michael.</subfield></datafield><datafield tag="245" ind1="1" ind2="0"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield tag="250" ind1=" " ind2=" "><subfield code="a">1st ed.</subfield></datafield><datafield tag="260" ind1=" " ind2=" "><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield tag="300" ind1=" " ind2=" "><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield tag="520" ind1=" " ind2=" "><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Fantasy.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield tag="650" ind1=" " ind2="1"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>

View file

@ -1 +1 @@
00714cam a2200205 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC1001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction. 00714cam a2200205 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC1001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction.

View file

@ -1 +1 @@
<?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0786808772</subfield></datafield><datafield ind2="_" ind1="_" tag="020"><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield ind2="_" ind1="_" tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2="_" ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="0" ind1="1" tag="245"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2="_" ind1="_" tag="250"><subfield code="a">1st ed.</subfield></datafield><datafield ind2="_" ind1="_" tag="260"><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield ind2="_" ind1="_" tag="300"><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield ind2="_" ind1="_" tag="520"><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Fantasy.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="1" ind1="_" tag="650"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection> <?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield ind2=" " ind1=" " tag="020"><subfield code="a">0786808772</subfield></datafield><datafield ind2=" " ind1=" " tag="020"><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield ind2=" " ind1=" " tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2=" " ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="0" ind1="1" tag="245"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2=" " ind1=" " tag="250"><subfield code="a">1st ed.</subfield></datafield><datafield ind2=" " ind1=" " tag="260"><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield ind2=" " ind1=" " tag="300"><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield ind2=" " ind1=" " tag="520"><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Fantasy.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>

View file

@ -0,0 +1 @@
00714cam a2200205 a 45000011288337600520030616111422.0008020805s2002 nyu j 000 1 eng 020 a0786808772020 a0786816155 (pbk.)040 aDLCcDLCdDLC1001 aChabon, Michael.24510aSummerland /cMichael Chabon.250 a1st ed.260 aNew York :bMiramax Books/Hyperion Books for Children,cc2002.300 a500 p. ;c22 cm.520 aEthan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.650 1aFantasy.650 1aBaseballvFiction.650 1aMagicvFiction.

View file

@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><collection xmlns="info:lc/xmlns/marcxchange-v2" xsi:schemaLocation="info:lc/xmlns/marcxchange-v2 http://www.loc.gov/standards/iso25577/marcxchange-2-0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><record format="MARC21" type="Bibliographic"><leader>00714cam a2200205 a 4500</leader><controlfield tag="001">12883376</controlfield><controlfield tag="005">20030616111422.0</controlfield><controlfield tag="008">020805s2002 nyu j 000 1 eng </controlfield><datafield ind2=" " ind1=" " tag="020"><subfield code="a">0786808772</subfield></datafield><datafield ind2=" " ind1=" " tag="020"><subfield code="a">0786816155 (pbk.)</subfield></datafield><datafield ind2=" " ind1=" " tag="040"><subfield code="a">DLC</subfield><subfield code="c">DLC</subfield><subfield code="d">DLC</subfield></datafield><datafield ind2=" " ind1="1" tag="100"><subfield code="a">Chabon, Michael.</subfield></datafield><datafield ind2="0" ind1="1" tag="245"><subfield code="a">Summerland /</subfield><subfield code="c">Michael Chabon.</subfield></datafield><datafield ind2=" " ind1=" " tag="250"><subfield code="a">1st ed.</subfield></datafield><datafield ind2=" " ind1=" " tag="260"><subfield code="a">New York :</subfield><subfield code="b">Miramax Books/Hyperion Books for Children,</subfield><subfield code="c">c2002.</subfield></datafield><datafield ind2=" " ind1=" " tag="300"><subfield code="a">500 p. ;</subfield><subfield code="c">22 cm.</subfield></datafield><datafield ind2=" " ind1=" " tag="520"><subfield code="a">Ethan Feld, the worst baseball player in the history of the game, finds himself recruited by a 100-year-old scout to help a band of fairies triumph over an ancient enemy.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Fantasy.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Baseball</subfield><subfield code="v">Fiction.</subfield></datafield><datafield ind2="1" ind1=" " tag="650"><subfield code="a">Magic</subfield><subfield code="v">Fiction.</subfield></datafield></record></collection>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,8 @@
{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01522nas a2200385 c 4500","001":["010000011"],"003":["DE-101"],"005":["20090911214751.0"],"007":["tu"],"008":["991118d19691969gw u||p|r ||| 0||||0ger c"],"016":[{"7 ":[{"2":"DE-101"},{"a":"010000011"}]},{"7 ":[{"2":"DE-600"},{"a":"5-x"}]}],"035":[{" ":[{"a":"(DE-599)ZDB5-x"}]},{" ":[{"a":"(OCoLC)183277955"}]}],"040":[{" ":[{"a":"9001"},{"b":"ger"},{"c":"DE-101"},{"d":"9999"}]}],"041":[{" ":[{"a":"ger"}]}],"044":[{" ":[{"c":"XA-DE"}]}],"084":[{" ":[{"a":["050","940"]},{"q":"DE-600"},{"2":"sdnb"}]}],"245":[{"10":[{"a":"A bis Z"},{"b":"ein Taschen- u. Nachschlagebuch über d. anderen Teil Deutschlands"},{"c":"hrsg. vom Bundesministerium für Gesamtdeutsche Fragen. Red. Günter Fischbach"}]}],"260":[{"3 ":[{"a":"Bonn"},{"b":"Dt. Bundes-Verl."}]}],"362":[{"0 ":[{"a":"Aufl. 11.1969"}]}],"591":[{" ":[{"a":"F/BAC"}]}],"650":[{" 7":[{"0":["(DE-588)4066724-8","(DE-101)040667243"]},{"a":"Wörterbuch"},{"2":"gnd"}]}],"651":[{" 7":[{"0":["(DE-588)4011890-3","(DE-101)040118908"]},{"a":"Deutschland"},{"g":"DDR"},{"2":"gnd"}]},{" 7":[{"0":["(DE-588)4011890-3","(DE-101)040118908"]},{"a":"Deutschland"},{"g":"DDR"},{"2":"gnd"}]}],"655":[{" 7":[{"a":"Wörterbuch"},{"2":"gnd"}]}],"689":[{"00":[{"0":["(DE-588)4011890-3","(DE-101)040118908"]},{"D":"g"},{"a":"Deutschland"},{"g":"DDR"}]},{"01":[{"0":["(DE-588)4066724-8","(DE-101)040667243"]},{"D":"s"},{"a":"Wörterbuch"}]},{"0 ":[{"5":["DE-600","DE-600"]}]},{"10":[{"0":["(DE-588)4011890-3","(DE-101)040118908"]},{"D":"g"},{"a":"Deutschland"},{"g":"DDR"}]},{"11":[{"A":"f"},{"a":"Wörterbuch"}]},{"1 ":[{"5":["DE-600","DE-600"]}]}],"710":[{"1 ":[{"0":["(DE-588)2028926-1","(DE-101)004854950"]},{"a":"Deutschland"},{"g":"Bundesrepublik"},{"b":"Bundesminister für Gesamtdeutsche Fragen"}]}],"780":[{"00":[{"i":"Vorg.:"},{"t":"SBZ von A bis Z"},{"w":["(DE-600)874-6","(DE-101)010008896"]}]}],"785":[{"00":[{"i":"Forts.:"},{"t":"DDR-Handbuch"},{"w":["(DE-600)130385-5","(DE-101)010746765"]}]}]}
{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01879nas a2200529 c 4500","001":["01000002X"],"003":["DE-101"],"005":["20120816085322.0"],"007":["tu"],"008":["991118d19632008xx z||p|r ||| 0||||0ger c"],"015":[{" ":[{"a":"08,B23,0382"},{"2":"dnb"}]}],"016":[{"7 ":[{"2":"DE-101"},{"a":"01000002X"}]},{"7 ":[{"2":"DE-600"},{"a":"7-3"}]}],"022":[{" ":[{"a":"0070-7252"}]},{" ":[{"a":"0375-2135"}]}],"029":[{"aa":[{"a":"0375-2135 = Faunistische Abhandlungen"}]}],"030":[{" ":[{"a":"SMTFB"}]}],"035":[{" ":[{"a":"(DE-599)ZDB7-3"}]},{" ":[{"a":"(OCoLC)224540449"}]}],"040":[{" ":[{"a":"9001"},{"b":"ger"},{"c":"DE-101"},{"d":"1242"}]}],"041":[{" ":[{"a":"ger"}]}],"044":[{" ":[{"c":["XA-DDDE","XA-DE"]}]}],"084":[{" ":[{"a":["590","Y"]},{"q":"DE-101"},{"2":"sdnb"}]},{" ":[{"a":"12,2"},{"2":"ssgn"}]},{" ":[{"a":"590"},{"q":"DE-600"},{"2":"sdnb"}]}],"210":[{"10":[{"a":"FAUN ABH (DRES)"}]}],"222":[{" 0":[{"a":"Faunistische Abhandlungen"}]}],"245":[{"10":[{"a":"Faunistische Abhandlungen"},{"c":"Publ.: Museum für Tierkunde Dresden, Staatliche Naturhistorische Sammlungen Dresden"}]}],"260":[{"3 ":[{"a":"Dresden"},{"b":"Museum für Tierkunde"}]},{" ":[{"a":"Leipzig"},{"b":"Geest & Portig"},{"c":"anfangs"}]}],"300":[{" ":[{"c":"24 cm"}]}],"362":[{"0 ":[{"a":"1.1963/66 - 26.2008; damit Ersch. eingest."}]}],"363":[{"00":[{"8":"1.1\\x"},{"i":"1963/66"}]},{"10":[{"8":"1.2\\x"},{"i":"2008"}]}],"515":[{" ":[{"a":"Ersch. unregelmäßig"}]}],"591":[{" ":[{"a":"84!(22-02-08)"}]}],"610":[{"17":[{"0":["(DE-588)4219481-7","(DE-101)042194814"]},{"a":"Museum für Tierkunde Dresden"},{"2":"gnd"}]}],"650":[{" 7":[{"2":"local"},{"a":"Zoologie"}]}],"655":[{" 7":[{"a":"Zeitschrift"},{"2":"gnd"}]}],"689":[{"00":[{"0":["(DE-588)4219481-7","(DE-101)042194814"]},{"D":"b"},{"a":"Museum für Tierkunde Dresden"}]},{"01":[{"A":"f"},{"a":"Zeitschrift"}]},{"0 ":[{"5":["DE-600","DE-600"]}]}],"710":[{"2 ":[{"0":["(DE-588)35521-5","(DE-101)000355216"]},{"a":"Staatliches Museum für Tierkunde Dresden"}]}],"775":[{"08":[{"i":"Online-Ausg."},{"t":"Faunistische Abhandlungen"},{"w":["(DE-600)2233959-0","(DE-101)979605725"]}]}],"780":[{"00":[{"i":"Vorg.:"},{"a":"Staatliches Museum für Tierkunde Dresden"},{"t":"Abhandlungen und Berichte aus dem Staatlichen Museum für Tierkunde in Dresden"},{"w":["(DE-600)6068-9","(DE-101)010081739"]}]}],"889":[{" ":[{"w":"(DE-101)550147969"}]}],"925":[{"r ":[{"a":"rb"}]}]}
{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"02523nas a2200673 c 4500","001":["010000038"],"003":["DE-101"],"005":["20110111105737.0"],"007":["tu"],"008":["991118d19642006xx z||p|r ||| 0||||0ger c"],"015":[{" ":[{"a":"97,B12,0347"},{"2":"dnb"}]}],"016":[{"7 ":[{"2":"DE-101"},{"a":"010000038"}]},{"7 ":[{"2":"DE-600"},{"a":"9-7"}]}],"022":[{" ":[{"a":"0070-7260"}]}],"029":[{"aa":[{"a":"0070-7260 = Malakologische Abhandlungen"}]}],"030":[{" ":[{"a":"SMTMB"}]}],"035":[{" ":[{"a":"(DE-599)ZDB9-7"}]},{" ":[{"a":"(OCoLC)643914482"}]}],"040":[{" ":[{"a":"9001"},{"b":"ger"},{"c":"DE-101"},{"d":"9001"}]}],"041":[{" ":[{"a":"ger"}]}],"044":[{" ":[{"c":["XA-DDDE","XA-DE"]}]}],"084":[{" ":[{"a":"590"},{"q":"DE-101"},{"2":"sdnb"}]},{" ":[{"a":"12,2"},{"2":"ssgn"}]},{" ":[{"a":"590"},{"q":"DE-600"},{"2":"sdnb"}]}],"210":[{"10":[{"a":"MALAKOL ABH (DRES)"}]},{"10":[{"a":"Malakol. Abh."}]}],"222":[{" 0":[{"a":"Malakologische Abhandlungen"}]}],"245":[{"10":[{"a":"Malakologische Abhandlungen"},{"c":"Staatliches Museum für Tierkunde Dresden"}]}],"247":[{"10":[{"a":"Malakologische Abhandlungen aus dem Staatlichen Museum für Tierkunde Dresden"},{"f":"Nebent. ab 13.1988"}]}],"260":[{"3 ":[{"a":"Dresden"},{"b":"Museum für Tierkunde"}]},{" ":[{"a":"Leipzig"},{"b":"Geest & Porting"},{"c":"anfangs"}]}],"300":[{" ":[{"c":"24 cm"}]}],"362":[{"0 ":[{"a":"1.1964/67 - 24.2006"}]}],"363":[{"00":[{"8":"1.1\\x"},{"i":"1964/67"}]},{"10":[{"8":"1.2\\x"},{"i":"2006"}]}],"365":[{" ":[{"b":"brosch. : M 19.50 (Einzelbd.)"}]}],"515":[{" ":[{"a":"Ersch. unregelmäßig"}]}],"550":[{" ":[{"a":"Hrsg. anfangs: W. Götz"}]}],"591":[{" ":[{"a":"14!IIA!(07-05-07)C!(06-08-07)"}]}],"610":[{"17":[{"0":["(DE-588)4219481-7","(DE-101)042194814"]},{"a":"Museum für Tierkunde Dresden"},{"2":"gnd"}]}],"650":[{" 7":[{"0":["(DE-588)4060087-7","(DE-101)040600874"]},{"a":"Tiere"},{"2":"gnd"}]},{" 7":[{"0":["(DE-588)4352566-0","(DE-101)942342860"]},{"a":"Weichtierkunde"},{"2":"gnd"}]},{" 7":[{"2":"local"},{"a":"Weichtiere"}]}],"651":[{" 7":[{"0":["(DE-588)4051176-5","(DE-101)040511766"]},{"a":"Sachsen"},{"2":"gnd"}]}],"655":[{" 7":[{"a":"Zeitschrift"},{"2":"gnd"}]},{" 7":[{"a":"Zeitschrift"},{"2":"gnd"}]}],"689":[{"00":[{"0":["(DE-588)4219481-7","(DE-101)042194814"]},{"D":"b"},{"a":"Museum für Tierkunde Dresden"}]},{"01":[{"A":"f"},{"a":"Zeitschrift"}]},{"0 ":[{"5":["DE-600","DE-600"]}]},{"10":[{"0":["(DE-588)4051176-5","(DE-101)040511766"]},{"D":"g"},{"a":"Sachsen"}]},{"11":[{"0":["(DE-588)4060087-7","(DE-101)040600874"]},{"D":"s"},{"a":"Tiere"}]},{"12":[{"0":["(DE-588)4352566-0","(DE-101)942342860"]},{"D":"s"},{"a":"Weichtierkunde"}]},{"13":[{"A":"f"},{"a":"Zeitschrift"}]},{"1 ":[{"5":["DE-600","DE-600"]}]}],"710":[{"2 ":[{"0":["(DE-588)35521-5","(DE-101)000355216"]},{"a":"Staatliches Museum für Tierkunde Dresden"}]}],"780":[{"00":[{"i":"Vorg.:"},{"a":"Staatliches Museum für Tierkunde Dresden"},{"t":"Abhandlungen und Berichte aus dem Staatlichen Museum für Tierkunde in Dresden"},{"w":["(DE-600)6068-9","(DE-101)010081739"]}]}],"785":[{"00":[{"i":"Forts.:"},{"t":"Mollusca"},{"w":["(DE-600)2280187-X","(DE-101)983950105"]}]}],"889":[{" ":[{"w":"(DE-101)550196447"}]}],"925":[{"r ":[{"a":"rb"}]}]}
{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"00967nas a2200265 c 4500","001":["010000046"],"003":["DE-101"],"005":["20070627061749.0"],"007":["tu"],"008":["991118d19491964it u||p|r b|| 0||||0||| c"],"016":[{"7 ":[{"2":"DE-101"},{"a":"010000046"}]},{"7 ":[{"2":"DE-600"},{"a":"10-3"}]}],"035":[{" ":[{"a":"(DE-599)ZDB10-3"}]},{" ":[{"a":"(OCoLC)183215696"}]}],"040":[{" ":[{"a":"9001"},{"b":"ger"},{"c":"DE-101"},{"d":"0012"}]}],"044":[{" ":[{"c":"XA-IT"}]}],"084":[{" ":[{"a":"540"},{"q":"DE-600"},{"2":"sdnb"}]}],"245":[{"10":[{"a":"Bibliografia polarografica"},{"n":"P. 1, Elenco dei lavori e indice degli autori"},{"c":"Consiglio Nazionale delle Ricerche, Centro di Studio per la Polarografia"}]}],"246":[{"19":[{"a":"Bibliografia polarografica / 1"}]}],"260":[{"3 ":[{"a":"Spoleto"},{"b":"[s.n.]"}]}],"362":[{"0 ":[{"a":"[1/3.]1922/49(1949); 4.1922/51(1951) - 15.1922/62(1964)"}]}],"591":[{" ":[{"a":"C"}]}],"772":[{"08":[{"i":"Beil. zu:"},{"t":"˜Laœ ricerca scientifica"},{"w":["(DE-600)205482-6","(DE-101)011179724"]}]}],"785":[{"00":[{"i":"Forts.:"},{"t":"Bibliografia polarografica / 1 2"},{"w":["(DE-600)3564-6","(DE-101)010053565"]}]}],"930":[{" ":[{"r":"P. 1, Elenco dei lavori e indice degli autori"}]}]}
{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01359nas a2200361 c 4500","001":["010000054"],"003":["DE-101"],"005":["20111123211515.0"],"007":["tu"],"008":["991118d19431986gw z||p|r ||| 0||||0ger c"],"016":[{"7 ":[{"2":"DE-101"},{"a":"010000054"}]},{"7 ":[{"2":"DE-600"},{"a":"12-7"}]}],"022":[{" ":[{"a":"0078-6799"}]},{" ":[{"a":"0371-5264"}]}],"030":[{" ":[{"a":"TAOGA"}]}],"035":[{" ":[{"a":"(DE-599)ZDB12-7"}]},{" ":[{"a":"(OCoLC)263588241"}]}],"040":[{" ":[{"a":"9001"},{"b":"ger"},{"c":"DE-101"},{"d":"9999"}]}],"041":[{" ":[{"a":"ger"}]}],"044":[{" ":[{"c":"XA-DE"}]}],"084":[{" ":[{"a":"600"},{"q":"DE-600"},{"2":"sdnb"}]}],"110":[{"2 ":[{"0":["(DE-588)35536-7","(DE-101)000355364"]},{"a":"Osram-Gesellschaft"},{"g":"München; Berlin, West"},{"4":"aut"}]}],"210":[{"10":[{"a":"Tech.-Wiss. Abh. Osram-Ges."}]}],"245":[{"10":[{"a":"Technisch-wissenschaftliche Abhandlungen der Osram-Gesellschaft"},{"c":"hrsg. unter Mitw. ... von Wilfried Meyer"}]}],"260":[{"3 ":[{"a":["Berlin","Göttingen","Heidelberg"]},{"b":"Springer"}]}],"362":[{"0 ":[{"a":"5.1943; 6.1953 - 11.1973; 12.1986; damit Ersch. eingest."}]}],"591":[{" ":[{"a":"C"}]}],"650":[{" 7":[{"0":["(DE-588)4035633-4","(DE-101)040356337"]},{"a":"Lichttechnik"},{"2":"gnd"}]},{" 7":[{"0":["(DE-588)4067488-5","(DE-101)040674886"]},{"a":"Zeitschrift"},{"2":"gnd"}]}],"689":[{"00":[{"0":["(DE-588)4035633-4","(DE-101)040356337"]},{"D":"s"},{"a":"Lichttechnik"}]},{"01":[{"0":["(DE-588)4067488-5","(DE-101)040674886"]},{"D":"s"},{"a":"Zeitschrift"}]},{"0 ":[{"5":["DE-600","DE-600"]}]}],"780":[{"00":[{"i":"Vorg.:"},{"a":"Osram-Konzern <Berlin>"},{"t":"Technisch-wissenschaftliche Abhandlungen aus dem Osram-Konzern"},{"w":["(DE-600)502428-6","(DE-101)012625787"]}]}]}
{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"02086nas a2200553 c 4500","001":["010000062"],"003":["DE-101"],"005":["20100713165615.0"],"007":["tu"],"008":["991118d19612006xx z||p|r ||| 0||||0ger c"],"015":[{" ":[{"a":"96,B09,0553"},{"2":"dnb"}]}],"016":[{"7 ":[{"2":"DE-101"},{"a":"010000062"}]},{"7 ":[{"2":"DE-600"},{"a":"13-9"}]}],"022":[{" ":[{"a":"0070-7287"}]},{" ":[{"a":"0375-5231"}]}],"029":[{"aa":[{"a":"0375-5231 = Zoologische Abhandlungen"}]}],"030":[{" ":[{"a":"ZASMA"}]}],"035":[{" ":[{"a":"(DE-599)ZDB13-9"}]},{" ":[{"a":"(OCoLC)643926073"}]}],"040":[{" ":[{"a":"9001"},{"b":"ger"},{"c":"DE-101"},{"d":"9999"}]}],"041":[{" ":[{"a":["ger","eng"]}]}],"044":[{" ":[{"c":["XA-DDDE","XA-DE"]}]}],"082":[{"04":[{"8":"1\\x"},{"a":"590.5"},{"q":"DE-101"},{"2":"22/ger"}]}],"084":[{" ":[{"a":"590"},{"q":"DE-101"},{"2":"sdnb"}]},{" ":[{"a":"12,2"},{"2":"ssgn"}]},{" ":[{"a":"590"},{"q":"DE-600"},{"2":"sdnb"}]}],"085":[{" ":[{"8":"1\\x"},{"b":"590"}]},{" ":[{"8":"1\\x"},{"z":"1"},{"s":"05"}]}],"210":[{"10":[{"a":"ZOOL ABH (DRESD)"}]}],"222":[{" 0":[{"a":"Zoologische Abhandlungen"}]}],"245":[{"10":[{"a":"Zoologische Abhandlungen"},{"c":"Staatliche Naturhistorische Sammlungen Dresden, Museum für Tierkunde"}]}],"247":[{"10":[{"a":"Zoologische Abhandlungen aus dem Staatlichen Museum für Tierkunde Dresden"},{"f":"Hauptsacht. auf d. Jg.-Titelbl. 42.1986/87 - 51.2000/01"}]},{"10":[{"a":"Abhandlungen und Berichte aus dem Staatlichen Museum für Tierkunde in Dresden"},{"f":"Nebent. 26.1961/64"}]},{"10":[{"a":"Zoologische Abhandlungen und Berichte"},{"f":"Hauptsacht. teils"}]}],"260":[{"3 ":[{"a":"Dresden"},{"b":"Museum für Tierkunde"}]},{" ":[{"a":"Leipzig"},{"b":"Geest & Portig"},{"c":"anfangs"}]}],"300":[{" ":[{"c":"25 cm"}]}],"362":[{"0 ":[{"a":"26.1961/64 - 56.2006"}]}],"363":[{"00":[{"8":"1.1\\x"},{"i":"1961/64"}]},{"10":[{"8":"1.2\\x"},{"i":"2006"}]}],"515":[{" ":[{"a":"Ersch. unregelmäßig"}]}],"591":[{" ":[{"a":"F/C"}]}],"650":[{" 7":[{"2":"local"},{"a":"Zoologie"},{"x":"Periodika"}]}],"710":[{"2 ":[{"0":["(DE-588)35521-5","(DE-101)000355216"]},{"a":"Staatliches Museum für Tierkunde Dresden"}]}],"775":[{"08":[{"i":"Online-Ausg."},{"t":"Zoologische Abhandlungen"},{"w":["(DE-600)2392089-0","(DE-101)986049786"]}]}],"780":[{"00":[{"i":"Vorg.:"},{"a":"Staatliches Museum für Tierkunde Dresden"},{"t":"Abhandlungen und Berichte aus dem Staatlichen Museum für Tierkunde in Dresden"},{"w":["(DE-600)6068-9","(DE-101)010081739"]}]}],"785":[{"00":[{"i":"Forts.:"},{"t":"Vertebrate zoology"},{"w":["(DE-600)2383989-2","(DE-101)985426152"]}]}],"889":[{" ":[{"w":"(DE-101)540322814"}]}],"925":[{"r ":[{"a":"rb"}]}]}
{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01148nas a2200289 c 4500","001":["010000070"],"003":["DE-101"],"005":["20050603141946.0"],"007":["tu"],"008":["991118d19651965xxuu||p|r b|| 0||||0eng c"],"016":[{"7 ":[{"2":"DE-101"},{"a":"010000070"}]},{"7 ":[{"2":"DE-600"},{"a":"15-2"}]}],"035":[{" ":[{"a":"(DE-599)ZDB15-2"}]},{" ":[{"a":"(OCoLC)310926585"}]}],"040":[{" ":[{"a":"9001"},{"b":"ger"},{"c":"DE-101"},{"d":"9999"}]}],"041":[{" ":[{"a":"eng"}]}],"044":[{" ":[{"c":"XD-US"}]}],"084":[{" ":[{"a":["390","300"]},{"q":"DE-600"},{"2":"sdnb"}]}],"245":[{"10":[{"a":"˜Theœ American behavioral scientist"},{"n":"The ABS guide to recent publications in the social and behavioral sciences"}]}],"246":[{"19":[{"a":"˜Theœ American behavioral scientist / ˜The œABS guide to recent publications in the social and behavioral sciences"}]},{"13":[{"a":"˜Theœ ABS guide to recent publications in the social and behavioral sciences"}]}],"260":[{"3 ":[{"a":"New York, NY"},{"b":"American Behavioral Scientist"}]},{"3 ":[{"a":["Oxford [u.a.]","Frankfurt, M."]},{"b":"Pergamon Press"}]}],"362":[{"0 ":[{"a":"1965"}]}],"591":[{" ":[{"a":"F/PC"}]}],"785":[{"00":[{"i":"Forts.:"},{"t":"Recent publications in the social and behavioral sciences"},{"w":["(DE-600)1355410-4","(DE-101)018543464"]}]}],"930":[{" ":[{"r":"The ABS guide to recent publications in the social and behavioral sciences"}]}]}
{"_FORMAT":"MarcXchange","_TYPE":"Bibliographic","_LEADER":"01040nas a2200265 c 4500","001":["010000089"],"003":["DE-101"],"005":["20071204010107.0"],"007":["tu"],"008":["991118d19501972xxku||p|r a|| 0||||0||| c"],"016":[{"7 ":[{"2":"DE-101"},{"a":"010000089"}]},{"7 ":[{"2":"DE-600"},{"a":"16-4"}]}],"022":[{" ":[{"a":"0001-9895"}]}],"035":[{" ":[{"a":"(DE-599)ZDB16-4"}]},{" ":[{"a":"(OCoLC)183277958"}]}],"040":[{" ":[{"a":"9001"},{"b":"ger"},{"c":"DE-101"},{"d":"9999"}]}],"044":[{" ":[{"c":"XA-GB"}]}],"084":[{" ":[{"a":"390"},{"q":"DE-600"},{"2":"sdnb"}]}],"245":[{"10":[{"a":"African abstracts"},{"b":"a quarterly review of ethnographic, social, and linguistic studies appearing in current periodicals = Bulletin analytique africaniste : revue trimestr. d'études ethnologiques, sociales et linguistiques paraissant dans les périodiques du jour"}]}],"260":[{"3 ":[{"a":"London"},{"b":"Internat. African Inst."}]}],"362":[{"0 ":[{"a":"1.1950 - 23.1972; damit Ersch. eingest."}]}]}