加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 如何在Silverlight中评估XPath表达式?

发布时间:2020-12-16 23:28:54 所属栏目:百科 来源:网络整理
导读:我需要允许高级用户输入XPath表达式并向他们显示找到的值或节点或属性.在.Net框架中,System.Xml.XPath.Extensions可用于调用XPathEvaluate,但Silverlight没有此 MSDN reference.是否有人重写了在Silverlight中使用的扩展方法?最好的方法是什么?为什么Silve
我需要允许高级用户输入XPath表达式并向他们显示找到的值或节点或属性.在.Net框架中,System.Xml.XPath.Extensions可用于调用XPathEvaluate,但Silverlight没有此 MSDN reference.是否有人重写了在Silverlight中使用的扩展方法?最好的方法是什么?为什么Silverlight或工具包( vote on the issue here)中没有它们?

解决方法

一种解决方案是使用通用处理程序并在异步请求中将处理外包给服务器.这是一步一步:

第一:

在Web项目中创建一个通用处理程序.使用以下代码为ProcessRequest添加ASHX文件(为简洁起见,简化):

public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";

        string xml = context.Request.Form["xml"].ToString();
        string xpath = context.Request.Form["xpath"].ToString();

        XmlReader reader = new XmlTextReader(new StringReader(xml));
        XDocument doc = XDocument.Load(reader);

        var rawResult = doc.XPathEvaluate(xpath);
        string result = String.Empty;
        foreach (var r in ((IEnumerable<object>)rawResult)) 
        {
            result += r.ToString();
        }

        context.Response.Write(result);

    }

应该注意的是,对于xml处理,您需要引用一些名称空间:

> System.IO
> System.Xml
> System.Xml.XPath
> System.Xml.Linq

第二:

您需要一些代码来允许您向通用处理程序发出异步帖子.下面的代码很长,但基本上你通过以下代码:

>您的通用处理程序的Uri
>键值对的字典(假设xml文档和xpath)
>成功和失败的回调
>对UserControl的调度计时器的引用,以便您可以在回调中访问UI(如有必要).

以下是我在实用程序类中放置的一些代码:

public class WebPostHelper
{
    public static void GetPostData(Uri targetURI,Dictionary<string,string> dataDictionary,Action<string> onSuccess,Action<string> onError,Dispatcher threadDispatcher)
    {
        var postData = String.Join("&",dataDictionary.Keys.Select(k => k + "=" + dataDictionary[k]).ToArray());

        WebRequest requ = HttpWebRequest.Create(targetURI);
        requ.Method = "POST";
        requ.ContentType = "application/x-www-form-urlencoded";
        var res = requ.BeginGetRequestStream(new AsyncCallback(
            (ar) =>
            {
                Stream stream = requ.EndGetRequestStream(ar);
                StreamWriter writer = new StreamWriter(stream);
                writer.Write(postData);
                writer.Close();
                requ.BeginGetResponse(new AsyncCallback(
                        (ar2) =>
                        {
                            try
                            {
                                WebResponse respStream = requ.EndGetResponse(ar2);
                                Stream stream2 = respStream.GetResponseStream();
                                StreamReader reader2 = new StreamReader(stream2);
                                string responseString = reader2.ReadToEnd();
                                int spacerIndex = responseString.IndexOf('|') - 1;
                                string status = responseString.Substring(0,spacerIndex);
                                string result = responseString.Substring(spacerIndex + 3);
                                if (status == "success")
                                {
                                    if (onSuccess != null)
                                    {
                                        threadDispatcher.BeginInvoke(() =>
                                        {
                                            onSuccess(result);
                                        });
                                    }
                                }
                                else
                                {
                                    if (onError != null)
                                    {
                                        threadDispatcher.BeginInvoke(() =>
                                        {
                                            onError(result);
                                        });
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                string data2 = ex.ToString();
                            }
                        }
                    ),null);

            }),null);
    }
}

第三:

调用实用程序类并传递xml和xpath:

private void testButton_Click(object sender,RoutedEventArgs e)
    {
        Dictionary<string,string> values = new Dictionary<string,string>();
        values.Add("xml","<Foo />");
        values.Add("xpath","/*");

        //Uri uri = new Uri("http://eggs/spam.ashx");
        Uri uri = new Uri("http://localhost:3230/xPathHandler.ashx");

        WebPostHelper.GetPostData(uri,values,(result) =>
            {
                MessageBox.Show("Your result " + result);
            },(errMessage) =>
            {
                MessageBox.Show("An error " + errMessage);
            },this.Dispatcher);

    }

让我重申,为简洁起见,此处的代码已经简化.您可能希望使用序列化程序将更复杂的类型传递给通用处理程序.当您从context.Request.Form集合中获取值时,您将需要以防御方式编写无效的“健全性检查”.但基本思想如上所述.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读