我这里没有发现问题。
我这里的文本是:点击此处下载
为了能在我的机器上运行,我稍微修改了一行代码:
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对象只要创建好了,就一直持续使用,可以加快响应速度。