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

点击:27178[回复顶层] [树状] [详细]
[回复留言] [回复(需要先登录)] [引用(需要先登录)]普通文章第 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
 

在线用户
(无) 
当前栏目在线用户数 0, 总在线用户数 0