国家图书馆OPAC检索结果的CNMARC数据的重新组装
时间:2026-01-23
时间:2026-01-23
国家图书馆OPAC检索结果的CNMARC数据的重新组装
黄晓辉
(广东建设职业技术学院图书馆,广东广州510450)
摘要:详细讨论了对国图OPAC的页面MARC数据的重新组装的程序思路,文中的代码使用C#语言,基于.net框架实现。
关键词:国图;CNMARC;C#
笔者在日常编目工作中经常会用到国家图书馆OPAC的检索服务,因为国图收藏的图书品种很齐全,它的CNMARC数据权威,而更重要的是任何人都可以通过免费使用它提供的检对于经费不足而没有索服务获取完整的CNMARC数据。因此,
充分利用国图OPAC购买收费CNMARC数据源的图书馆来说,
的检索服务也许是最佳的数据准备途径,而技术上,这里面要解决的是两个方面,即收集和重新组装。笔者在《国图OPAC的一文中详细讨论了前者的实MARC页面数据下载的编程思路》
现思路,本文将主要讨论后者。
国图检索结果的MARC格式是以如下形式存在的:<tr>
<tdclass=td1id=boldwidth="5%"nowrap>字段名和指示符</td>
<tdclass=td1>字段内容</td>
</tr>
通过利用正则表达式等技术,我们可以将实际内容提取出来用以下结构保存:
publicstructNameContent{
publicreadonlystringNCKey;//存储字段名和指示符
publicreadonlystringNCValue;//存储字段内容)publicNameContent(stringncKey,stringncValue{
NCKey=ncKey;
NCValue=ncValue;}
}
但是在提取之前,还要将存在的HTML特殊字符转换成相应的字符。之后所有字段数据可以保存到一个List<Name
(allNameContents)里,对allNameContentsContent>类型的对象
进行处理以生成标准CNMARC逻辑上包括以下环节。
}
()=="LDR")if(fn.ToUpper
此时还不完整,还需处理ldr=fv;//获取记录头标,
(fn[0]>'8')if
continue;//排除没用的字段
))if(!(fn[0]=='0'&&fn[1]=='0'{//只对010之后的
字段处理指示符
)if(fn.Length==4
)+"\x0020"+fv;//对fv=fn.Substring(3,1
未定义的位至空位,下同
)if(fn.Length==5
(3,2)+fv;fv=fn.Substring
)if(fn.Length==3
fv="\x0020"+"\x0020"+fv;
(fv);并//去除所有子字段标识符后面的空格,fv=CorrectFC
将'|'转换为(char)31
fv+="\x001E";//加入字段分隔符
(newNameContent(fn,fv));//填充fnfvfnfv.Add
}
这里要说明一下CorrectFC函数,该函数如下:
(stringfieldContent)publicstaticstringCorrectFC{
(?'sfi'[0-9A-Za-z])stringpat="\\|\\s";\\匹配形如"|a
"的子串
){returnRegex.Replace(sfv,pat,delegate(Matchm();});return"\x001F"+m.Groups["sfi"].ToString
}
2对处理后的目标字段排序
为确保所有字段有序,有必要对fnfv排序。而为了对
NameContent类型排序,有必要定义一个实现IComparer<该类只要提供下面这个方NameContent>接口的类NCComparer,
法就行,(NameContentx,),考虑publicintCompareNameContenty到篇幅,不列出实现代码。那么排序的代码如下:
(newNCComparer());fnfv.Sort
1对字段的处理
首先,提取出来的字段数据中并不是所有字段都有用,里面存在一些如“CAT”“OWN”等的字段,可以限定一个选取范对符合选取范围的,接着是处围,比如只选取801之前的字段,理指示符,只需对不是“00x”形式的字段进行处理,方法是将可以NCKey中的指示符部分提取出来与字段内容串接。因此,
遍历allNameContents执行下面代码:
();List<NameContent>fnfv=newList<NameContent>//存储
目标字段名-字段对
stringldr="";//记录头标
)for(inti=0;i<allNameContents.Count;i++{
stringfn=allNameContents[i].NCKey,fv=allName
Contents[i].NCValue;
组装各个区,并处理记录头标3计算目次区,
这是最后一个环节,首先遍历fnfv,计算各个字段长度、起
始位置,组装地址目次区和数据字段区,然后根据前面的计算值处理记录头标,最后组装整个CNMARC记录:
intcurPos=0;//当前位置
stringfAddrsSection="",fDataSection="";//分别存储地址目次区和数据字段区
)for(inti=0;i<fnfv.Count;i++{
(下转第44页)
…… 此处隐藏:196字,全部文档内容请下载后查看。喜欢就下载吧 ……