add MarcXML writer
This commit is contained in:
parent
ddae3f750c
commit
af6ace4750
4 changed files with 89 additions and 6 deletions
9
src/main/java/org/xbib/marc/MarcXmlConstants.java
Normal file
9
src/main/java/org/xbib/marc/MarcXmlConstants.java
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package org.xbib.marc;
|
||||||
|
|
||||||
|
public interface MarcXmlConstants {
|
||||||
|
|
||||||
|
String MARCXML_NS_URI = "http://www.loc.gov/MARC21/slim";
|
||||||
|
|
||||||
|
String MARCXML_SCHEMA_LOCATION = "http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd";
|
||||||
|
|
||||||
|
}
|
|
@ -22,6 +22,7 @@ import org.xbib.marc.MarcListener;
|
||||||
import org.xbib.marc.MarcRecord;
|
import org.xbib.marc.MarcRecord;
|
||||||
import org.xbib.marc.MarcRecordListener;
|
import org.xbib.marc.MarcRecordListener;
|
||||||
import org.xbib.marc.MarcXchangeConstants;
|
import org.xbib.marc.MarcXchangeConstants;
|
||||||
|
import org.xbib.marc.MarcXmlConstants;
|
||||||
import org.xbib.marc.label.RecordLabel;
|
import org.xbib.marc.label.RecordLabel;
|
||||||
import org.xbib.marc.transformer.field.MarcFieldTransformers;
|
import org.xbib.marc.transformer.field.MarcFieldTransformers;
|
||||||
import org.xbib.marc.transformer.value.MarcValueTransformers;
|
import org.xbib.marc.transformer.value.MarcValueTransformers;
|
||||||
|
@ -51,7 +52,7 @@ import java.util.logging.Logger;
|
||||||
* and fires events to a Marc listener.
|
* and fires events to a Marc listener.
|
||||||
*/
|
*/
|
||||||
public class MarcContentHandler
|
public class MarcContentHandler
|
||||||
implements MarcXchangeConstants, MarcListener, MarcRecordListener,
|
implements MarcXmlConstants, MarcXchangeConstants, MarcListener, MarcRecordListener,
|
||||||
EntityResolver, DTDHandler, ContentHandler, ErrorHandler {
|
EntityResolver, DTDHandler, ContentHandler, ErrorHandler {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(MarcContentHandler.class.getName());
|
private static final Logger logger = Logger.getLogger(MarcContentHandler.class.getName());
|
||||||
|
|
|
@ -82,7 +82,7 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
|
||||||
|
|
||||||
private static final QName SUBFIELD_ELEMENT = new QName(NAMESPACE_URI, SUBFIELD, "");
|
private static final QName SUBFIELD_ELEMENT = new QName(NAMESPACE_URI, SUBFIELD, "");
|
||||||
|
|
||||||
private final XMLEventFactory eventFactory;
|
protected final XMLEventFactory eventFactory;
|
||||||
|
|
||||||
private final Namespace namespace;
|
private final Namespace namespace;
|
||||||
|
|
||||||
|
@ -304,10 +304,7 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
|
||||||
String realtype = getType() != null ? getType() : type != null ? type : getDefaultType();
|
String realtype = getType() != null ? getType() : type != null ? type : getDefaultType();
|
||||||
attrs.add(eventFactory.createAttribute(TYPE_ATTRIBUTE, realtype));
|
attrs.add(eventFactory.createAttribute(TYPE_ATTRIBUTE, realtype));
|
||||||
if (!schemaWritten) {
|
if (!schemaWritten) {
|
||||||
attrs.add(eventFactory.createAttribute("xmlns:xsi",
|
writeSchema(attrs);
|
||||||
XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI));
|
|
||||||
attrs.add(eventFactory.createAttribute("xsi:schemaLocation",
|
|
||||||
NAMESPACE_URI + " " + NAMESPACE_SCHEMA_LOCATION));
|
|
||||||
schemaWritten = true;
|
schemaWritten = true;
|
||||||
}
|
}
|
||||||
xmlEventConsumer.add(eventFactory.createStartElement(RECORD_ELEMENT, attrs.iterator(), namespaces));
|
xmlEventConsumer.add(eventFactory.createStartElement(RECORD_ELEMENT, attrs.iterator(), namespaces));
|
||||||
|
@ -488,6 +485,13 @@ public class MarcXchangeWriter extends MarcContentHandler implements Flushable,
|
||||||
return exception;
|
return exception;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void writeSchema(List<Attribute> attrs) throws XMLStreamException {
|
||||||
|
attrs.add(eventFactory.createAttribute("xmlns:xsi",
|
||||||
|
XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI));
|
||||||
|
attrs.add(eventFactory.createAttribute("xsi:schemaLocation",
|
||||||
|
NAMESPACE_URI + " " + NAMESPACE_SCHEMA_LOCATION));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Split records if configured. A splitlimit of -1 prevents splitting.
|
* Split records if configured. A splitlimit of -1 prevents splitting.
|
||||||
*/
|
*/
|
||||||
|
|
69
src/main/java/org/xbib/marc/xml/MarcXmlWriter.java
Normal file
69
src/main/java/org/xbib/marc/xml/MarcXmlWriter.java
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
package org.xbib.marc.xml;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.OutputStreamWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.xml.XMLConstants;
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
import javax.xml.stream.events.Attribute;
|
||||||
|
import javax.xml.stream.util.XMLEventConsumer;
|
||||||
|
|
||||||
|
public class MarcXmlWriter extends MarcXchangeWriter {
|
||||||
|
|
||||||
|
private static final String NAMESPACE_URI = MARCXML_NS_URI;
|
||||||
|
|
||||||
|
private static final String NAMESPACE_SCHEMA_LOCATION = MARCXML_SCHEMA_LOCATION;
|
||||||
|
|
||||||
|
public MarcXmlWriter(OutputStream out) throws IOException {
|
||||||
|
super(out);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MarcXML writer on an underlying output stream.
|
||||||
|
* @param out the underlying output stream
|
||||||
|
* @param indent if true, indent MarcXchange output
|
||||||
|
* @throws IOException if writer can not be created
|
||||||
|
*/
|
||||||
|
public MarcXmlWriter(OutputStream out, boolean indent) throws IOException {
|
||||||
|
super(new OutputStreamWriter(out, StandardCharsets.UTF_8), indent);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MarcXML writer on an underlying writer.
|
||||||
|
* @param writer the underlying writer
|
||||||
|
* @throws IOException if writer can not be created
|
||||||
|
*/
|
||||||
|
public MarcXmlWriter(Writer writer) throws IOException {
|
||||||
|
super(writer, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MarcXML writer on an underlying writer.
|
||||||
|
* @param writer the underlying writer
|
||||||
|
* @param indent if true, indent MarcXchange output
|
||||||
|
* @throws IOException if writer can not be created
|
||||||
|
*/
|
||||||
|
public MarcXmlWriter(Writer writer, boolean indent) throws IOException {
|
||||||
|
super(writer, indent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MarcXmlWriter(String fileNamePattern, int splitlimit, int bufferSize, boolean compress, boolean indent)
|
||||||
|
throws IOException {
|
||||||
|
super(fileNamePattern, splitlimit, bufferSize, compress, indent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MarcXmlWriter(XMLEventConsumer consumer) {
|
||||||
|
super(consumer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void writeSchema(List<Attribute> attrs) throws XMLStreamException {
|
||||||
|
attrs.add(eventFactory.createAttribute("xmlns:xsi",
|
||||||
|
XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI));
|
||||||
|
attrs.add(eventFactory.createAttribute("xsi:schemaLocation",
|
||||||
|
NAMESPACE_URI + " " + NAMESPACE_SCHEMA_LOCATION));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue