private void LoadRecord(XElement recordElement, ref IRecord rec) { foreach (var elem in recordElement.Elements()) { switch (elem.Name.LocalName) { case LEADER: rec.Leader = factory.NewLeader(elem.Value); break; case CONTROLFIELD: rec.AddVariableField( factory.NewControlField( elem.Attribute(TAG_ATTR).Value, elem.Value)); break; case DATAFIELD: var ind1 = elem.Attribute(IND_1_ATTR) != null?elem.Attribute(IND_1_ATTR).Value : " "; var ind2 = elem.Attribute(IND_2_ATTR) != null?elem.Attribute(IND_2_ATTR).Value : " "; dataField = factory.NewDataField( elem.Attribute(TAG_ATTR).Value, string.IsNullOrEmpty(ind1) ? ' ' : ind1[0], string.IsNullOrEmpty(ind2) ? ' ' : ind2[0]); foreach (var subField in elem.Elements(XName.Get(SUBFIELD, Constants.MARCXML_NS_URI)).Select(a => factory.NewSubfield( a.Attribute(CODE_ATTR).Value[0], a.Value))) { dataField.AddSubfield(subField); } rec.AddVariableField(dataField); break; default: break; } } }
public void TestConstructor() { var leader = factory.NewLeader(); Assert.IsNotNull(leader, "leader is null"); }
private void ParseRecord(IRecord record, byte[] byteArray, byte[] recordBuf, int recordLength) { ILeader ldr; ldr = factory.NewLeader(); ldr.RecordLength = recordLength; int directoryLength = 0; try { ParseLeader(ldr, byteArray); directoryLength = ldr.BaseAddressOfData - (24 + 1); } catch (IOException e) { throw new MarcException("error parsing leader with data: " + byteArray.ConvertToString(), e); } catch (MarcException e) { throw new MarcException("error parsing leader with data: " + byteArray.ConvertToString(), e); } // if MARC 21 then check encoding switch (ldr.CharCodingScheme) { case ' ': if (!isOverride) { encoding = "ISO-8859-1"; } break; case 'a': if (!isOverride) { encoding = "UTF-8"; } break; } record.Leader = ldr; if ((directoryLength % 12) != 0) { throw new MarcException("invalid directory"); } using (var inputrec = new InputStream(recordBuf)) { int size = directoryLength / 12; String[] tags = new String[size]; int[] lengths = new int[size]; byte[] tag = new byte[3]; byte[] length = new byte[4]; byte[] start = new byte[5]; String tmp; try { for (int i = 0; i < size; i++) { inputrec.Read(tag); tmp = tag.ConvertToString(); tags[i] = tmp; inputrec.Read(length); tmp = length.ConvertToString(); lengths[i] = int.Parse(tmp); inputrec.Read(start); } if (inputrec.ReadByte() != Constants.FT) { throw new MarcException("expected field terminator at end of directory"); } for (int i = 0; i < size; i++) { GetFieldLength(inputrec); if (Verifier.IsControlField(tags[i])) { byteArray = new byte[lengths[i] - 1]; inputrec.Read(byteArray); if (inputrec.ReadByte() != Constants.FT) { throw new MarcException("expected field terminator at end of field"); } var field = factory.NewControlField(); field.Tag = tags[i]; field.Data = GetDataAsString(byteArray); record.AddVariableField(field); } else { byteArray = new byte[lengths[i]]; inputrec.Read(byteArray); try { record.AddVariableField(ParseDataField(tags[i], byteArray)); } catch (Exception e) { throw new MarcException( "error parsing data field for tag: " + tags[i] + " with data: " + byteArray.ConvertToString(), e); } } } if (inputrec.ReadByte() != Constants.RT) { throw new MarcException("expected record terminator"); } } catch (IOException e) { throw new MarcException("an error occured reading input", e); } } }