Linq To Xml实现XPath通用函数(Silverlight下的XPath)

熊哥实现的比较通用的类似XPath查询函数,记录一下。
参考:Linq To Xml实现类似XPath查询
忘了说明一下:Silverlight不支持XPath查询,只能变通一下了。

ExpandedBlockStart.gif 大气象
public   static  IEnumerable < XElement >  Find( string  data,  string  node)
{
    var test 
=  XDocument.Parse(data);
    IEnumerable
< XElement >  find  =   null ;

    
if  ( string .IsNullOrEmpty(node)  ||   ! node.StartsWith( @" \\ " ))  return   null ;
    
string [] list  =  node.Substring( 2 ).Split( ' \\ ' );
    
if  ( string .IsNullOrEmpty(list[ 0 ]))  return  test.Descendants();

    
string [] attr  =   null string  nodeName  =   string .Empty;
    
foreach  ( string  info  in  list)
    {
        
if  (info.IndexOf( " [ " !=   - 1   &&  info.IndexOf( " ] " !=   - 1 )
        {
            nodeName 
=  info.Split( ' [ ' )[ 0 ];

            attr 
=  info.Split( ' [ ' )[ 1 ].Replace( " ] " "" ).Replace( " @ " "" ).Split( ' = ' );
            find 
=  find  ==   null   ?  test.Descendants(nodeName).Where(w  =>  w.Attribute(attr[ 0 ]).Value  ==  attr[ 1 ]).ToList() : find.Descendants(nodeName).Where(w  =>  w.Attribute(attr[ 0 ]).Value  ==  attr[ 1 ]).ToList();
        }
        
else
        {
            
if  (find  ==   null ) find  =  test.Descendants();
            find.SelectMany(s 
=>  s.Elements(info));
        }
    }
    
return  find;
}
private   void  F()
{
    
string  data  =   @" <?xml version=""1.0"" encoding=""utf-8"" ?><root><o1 id=""1""><o2 id=""1""><o3>5</o3><o3>6</o3></o2><o2 id=""2""><o3>11</o3><o3>22</o3></o2></o1><o1 id=""2""><o2 id=""1""><o3>111</o3><o3>222</o3></o2><o2 id=""2""><o3 id=""1""><o4>2222</o4><o4>3333</o4></o3></o2></o1></root> " ;
    
// var test = Find(data, @"\\o1[@id=1]\o2[@id=1]\o3");
    
// var test = Find(data, @"\\o1[@id=1]\o2[@id=2]\o3");
    
// var test = Find(data, @" \\o1[@id=2]\o2[@id=2]\o3[@id=1]\o4");
    var test  =  Find(data,  @" \\o1[@id=2]\o2[@id=2]\o3[@id=1]\o4 " );
    
if  (test  !=   null )
    {
        
foreach  (XElement info  in  test)
        {
            
if  (info  !=   null )
                Response.Write(info.ToString());
        }
    }
}

 

 

转载于:https://www.cnblogs.com/greatverve/archive/2010/07/21/linq-to-xml-xpath-function.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值