欢迎您来到 数字平台。 您尚未登录。[登录] [注册新用户]
当前位置: 论坛首页 / 栏目 产品与服务 / 文章 448

点击:28049[回复顶层] [树状] [详细]
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 1 楼
文章id: 442
加四角号代码问题

作者: Harry


这两天把加四角号的代码写了一下,我先做了一个取四角号的单机小程序,就是:文本框输入名字—点击查号按钮—显示四角号,调试成功,能正常取号。但是我在dp2catalog_marc_autogen.cs里面加入相关代码,并进行了必要的修改后,程序出错。

我的程序是这样的:

先在相关位置加入:

using System.Xml;
using System.Xml.XPath;

再在相关位置加入:

actions.NewItem("905字段加四角号", "905字段加加四角号", "AddFourAngle", false);

再在相关位置加入:

 void AddFourAngle()
        {
            string sijiaohao = "";
            string author = "";
            string author1 = "";
            string author2 = "";
            author1 = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("701", "a");
            author2 = this.DetailForm.MarcEditor.Record.Fields.GetFirstSubfield("711", "a");
            getSiJiaoHao getsjh = new getSiJiaoHao();
            if (author1 != "")
            {

                author = author1;
                if (author.Length == 1)
                {
                    getsjh.authorchar = author[0];
                    getsjh.QuHao();
                    sijiaohao = getsjh.hao;     //1个字,取号规则:1234
                }
                if (author.Length == 2)
                {
                    for (int i = 0; i <= 1; i++)
                    {
                        getsjh.authorchar = author[i];
                        getsjh.QuHao();
                        if (i == 0)
                            sijiaohao = getsjh.hao.Substring(0, 1) + getsjh.hao.Substring(3, 1);    //两个字,取号规则:1414
                        if (i == 1)
                            sijiaohao += getsjh.hao.Substring(0, 1) + getsjh.hao.Substring(3, 1);
                    }
                }
                if (author.Length >= 3)
                {
                    author = author.Substring(0, 3);
                    for (int i = 0; i <= 2; i++)
                    {
                        getsjh.authorchar = author[i];
                        getsjh.QuHao();
                        if (i == 0)
                            sijiaohao = getsjh.hao.Substring(0, 1) + getsjh.hao.Substring(3, 1);    //大于等于3个字,只取前3个字,取号规则:1411
                        if (i == 1)
                            sijiaohao += getsjh.hao.Substring(0, 1);
                        if (i == 2)
                            sijiaohao += getsjh.hao.Substring(0, 1);
                    }
                }
            }
            else if (author2 != "")
            {
                if (author2.Length < 4)
                {
                    MessageBox.Show(this.DetailForm, "团体责任者这么短,取号规则研究中...");
                    return;
                }
                else
                {
                    author = author2.Substring(0, 3);
                    for (int i = 0; i <= 3; i++)
                    {
                        getsjh.authorchar = author[i];
                        getsjh.QuHao();
                        if (i == 0)
                            sijiaohao = getsjh.hao.Substring(0, 1);    //团体只取前四个字,取号规则:1111
                        if (i == 1)
                            sijiaohao += getsjh.hao.Substring(0, 1);
                        if (i == 2)
                            sijiaohao += getsjh.hao.Substring(0, 1);
                        if (i == 3)
                            sijiaohao += getsjh.hao.Substring(0, 1);
                    }
                }
            }
            else
            {
                MessageBox.Show(this.DetailForm, "701/711中均未发现$a,无法处理");
                return;
             }
            this.DetailForm.MarcEditor.Record.Fields.SetFirstSubfield("905", "e", sijiaohao);
        }

最后,在代码的最后加入:

    class getSiJiaoHao
    {
        public string hao;
        public char authorchar;
        public void QuHao()
        {
            XPathDocument doc = new XPathDocument("sijiaohao.xml");
            XPathNavigator nav = ((IXPathNavigable)doc).CreateNavigator();
            XPathNodeIterator iter = nav.Select("/Collection/Character[@char='" + authorchar + "']");
            while (iter.MoveNext())
            {
                hao = iter.Current.Value;
            }
        }
    }

并且将sijiaohao.xml拷贝到相关目录下。

Ctrl+A 选择“905字段加四角号”后发生如下错误。

 

我尝试把所有代码都套入namespace dp2script,也不行,还是同样的错误。

麻烦老师帮我看一下,我的程序写得还是很工整,看了应该不会害眼,呵呵。

另外,关于我的取号小程序,我是通过在项目上添加新建项— xml文件添加并编写了sijiaohao.xml,并将其属性更改为“如果较新则复制”,在本机调试没有问题。但是发布到localhost后,再安装,运行程序出错,说是找不到...sijiaohao.xml,我把sijiaohao.xml拷贝到相关路径下,程序就正常了,请问老师这是什么问题啊?我用的编辑环境是 Visual C# 2008。

以下是我在autogen代码和取号小程序中用到的sijiaohao.xml(比较完整的四角号码表,也很准确)

sijiaohao.xml



发表时间: 2009-03-08 18:55:43
最后修改时间: 2009-03-08 19:10:58
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 2 楼
文章id: 443

作者: xietao


我这里没有发现问题。

我这里的文本是:点击此处下载

为了能在我的机器上运行,我稍微修改了一行代码:

    class getSiJiaoHao
    {
        public string hao;
        public char authorchar;
        public void QuHao()
        {
            XPathDocument doc = new XPathDocument("f:\\temp\\sijiaohao.xml");
            XPathNavigator nav = ((IXPathNavigable)doc).CreateNavigator();
            XPathNodeIterator iter = nav.Select("/Collection/Character[@char='" + authorchar + "']");
            while (iter.MoveNext())
            {
                hao = iter.Current.Value;
            }
        }
    } 

因为我的本机这里把那个XML文件放在了f:\temp下。

为了方便安装部署,这个XML文件可以用以下两种方式处理:

1) 放在内务前端的数据目录下。在内务前端“文件/打开数据目录文件夹”可以找到这个文件夹,把XML文件放进去。在脚本代码中,在MyHost类里面,可以用this.MainForm.DataDir得到这个目录的路径字符串。

2) 通过HTTP访问XML文件。XPathDocument的参数uri可以写为类似 "http://localhost/somefolder/somefile.xml"的形式,你只需把那个XML文件部署到localhost的IIS的一个虚拟目录中即可。不过这个方法,每次要从localhost抓过来文件,可能速度有些慢,可以改进为先看一个本地目录(例如上述内务前端的数据目录)下有没有这个文件,如果没有再从http协议抓取,抓取的方法可以用WebClient类,而XPathDocument直接打开本地文件即可。

~~~

再提一点意见:

1) 用XPathDocument打开XML文件,然后获取XPathNavigator,这个做法有点让人看花了眼,我估计多半是你不熟悉相关概念,而走了一个高级的弯路。其实用XmlDocument打开XML文件,然后用一个XmlNode对象(比如文档根DocumentElement)的SelectSingleNode()或者SelectNodes()方法就可以了。

2) 在代码比较简单的情况下,getSiJiaoHao似乎没有必要专门成为一个类。只要在MyHost类里面编写一个QuHao()函数就可以了,带上三个参数,第一个参数为一个XmlDocument对象。XmlDocument对象存储在MyHost类里面即可,也就不会因反复创建而耽误时间。

3) 不过MyHost类毕竟是每次Ctrl+A触发的时候现创建,如果要将创建好的对象保持到和内务前端的生命周期一致,可以使用this.MainForm.ParamTable这样一个Hashtable机制,用类似this.MainForm.ParamTable["sjhm_dom"] =  sjhm_dom的语句设置对象,用类似XmlDocument sjhm_dom = (XmlDocument)this.MainForm.ParamTable["sjhm_dom"]的语句来取出对象。这样,XmlDocument对象只要创建好了,就一直持续使用,可以加快响应速度。



发表时间: 2009-03-08 21:48:15
最后修改时间: 2009-03-08 21:49:25



[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 3 楼
文章id: 444
回复: 加四角号代码问题

作者: xietao


以下是引用 Harry 于 2009-3-8 18:55:43 发表的文字:

...

另外,关于我的取号小程序,我是通过在项目上添加新建项— xml文件添加并编写了sijiaohao.xml,并将其属性更改为“如果较新则复制”,在本机调试没有问题。但是发布到localhost后,再安装,运行程序出错,说是找不到...sijiaohao.xml,我把sijiaohao.xml拷贝到相关路径下,程序就正常了,请问老师这是什么问题啊?我用的编辑环境是 Visual C# 2008。...

 
不知道您所说的发布是什么发布,是指ClickOnce方式么?另外相关路径指什么路径?


发表时间: 2009-03-08 21:55:57



[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 4 楼
文章id: 445
谢谢

作者: Harry


谢谢老师的指点,应该就是sijiaohao.xml文件放置位置的原因,我之前把sijiaohao.xml和所有有pinyin.xml的路径下,按照您的方法放置到localhost...就可以用了。

由于我对C#还不熟,有些待改善的地方一时还摸不到门路,期待做下一个功能的时候能写出有更高效的代码。

关于单机小程序的问题,我发布的截面如图,发布到本机了。再从本机localhost安装后sijiaohao.xml被安装到了一个单独的路径,程序引用不到,出错。手动把sijiaohao.xml拷贝到出错显示没有文件的路径下,程序才正常。



资源:

-- ID: 0 文件名: 1.JPG 尺寸: 41388 最后修改时间: 2009-03-10 19:16:13 --


-- ID: 1 文件名: 2.JPG 尺寸: 41346 最后修改时间: 2009-03-10 19:22:18 --



发表时间: 2009-03-10 19:17:03
最后修改时间: 2009-03-10 19:22:57
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 5 楼
文章id: 447
回复: 谢谢

作者: xietao


==========

以下是引用 Harry 于 2009-3-10 19:17:03 发表的文字:

谢谢老师的指点,应该就是sijiaohao.xml文件放置位置的原因,我之前把sijiaohao.xml和所有有pinyin.xml的路径下,按照您的方法放置到localhost...就可以用了。

由于我对C#还不熟,有些待改善的地方一时还摸不到门路,期待做下一个功能的时候能写出有更高效的代码。

关于单机小程序的问题,我发布的截面如图,发布到本机了。再从本机localhost安装后sijiaohao.xml被安装到了一个单独的路径,程序引用不到,出错。手动把sijiaohao.xml拷贝到出错显示没有文件的路径下,程序才正常。

==========

关于发布的问题,我提几点注意事项,看看是否有用:

1) 要安装的xml文件,首先要包含在solution之中,和.cs文件一样,要包含在“解决方案资源管理器”中,可以看到;

2) 不要用项目节点的上下文菜单上的“发布...”命令,而要用上下文菜单上的“属性”命令;

3) 在属性的“发布”属性页里,点“应用程序文件”按钮,在对话框里面设置好xml文件的“发布状态”栏。试一下几个值,看看哪个管用;

4) 设置好各种参数后,按“立即发布”按钮。

最后,多看看How to...文档,里面有实际的例子和步骤。



发表时间: 2009-03-12 04:27:30



[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 6 楼
文章id: 448
问题已解决

作者: Harry


按照您的方法,问题已经解决了,谢谢。



发表时间: 2009-03-12 13:29:02
页 1 / 1
 

在线用户
访客访客   访客访客   访客访客   访客访客 (我自己)   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客   访客访客
当前栏目在线用户数 31, 总在线用户数 32