首页 新闻 会员 周边

Xpath 与 正则表达式 的问题?

0
悬赏园豆:20 [已解决问题] 解决于 2011-09-07 16:12

  <book > 
      
<email></email>
      
<email>aa@sohu.com</email>
        
<email>bb@sohu.com</email>
  </book>

check(/book/email, "[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4}")

通过自定义函数,过滤是否符合email格式

check是我自定义扩展的方法,现在问题是如果,第一个参数传入的是节点集XPathNodeIterator,比如有3个,那么现在匹配结果的应该有2个,那么就是要返回包含2个选中节点的XPathNodeIterator,问题是我怎么去过滤掉那个不是email的节点呢?

 

ricky_syh的主页 ricky_syh | 初学一级 | 园豆:0
提问于:2011-09-05 15:36
< >
分享
最佳答案
0

public static XPathNodeIterator check(string path, string regex)
{
XmlDocument xmlDoc
= new XmlDocument();
xmlDoc.Load(
@"test.xml");
XPathNavigator navigator
= xmlDoc.CreateNavigator();
XPathNodeIterator xni
= navigator.Select(path);
Regex r
= new Regex(regex);
while (xni.MoveNext())
{
if (!r.IsMatch(xni.Current.Value))
{
xni.Current.DeleteSelf();
}
}
return xni;
}

调用:
xmlest.check(
"/book/email", @"[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z]{2,4}");

收获园豆:20
artwl | 专家六级 |园豆:16736 | 2011-09-05 17:02

感谢,这个方法是可行的,但是有一个问题
我的XML对象不是XmlDocument,而是XmlDataDocument,因为我是从DataSet直接转过来,这样的好处大数据量的时候转换的快,否则转换成XmlDocument时候可能会内存溢出。但是相同的代码执行到xni.Current.DeleteSelf();时,就会报错“不支持所指定的方法”,郁闷,望回答

XmlDataDocument x = new XmlDataDocument(dataSet);

XPathNavigator  nav = x.CreateNavigator();XPathNodeIterator xni = navigator.Select(path);
            Regex r
= new Regex(regex);
           
while (xni.MoveNext())
            {
               
if (!r.IsMatch(xni.Current.Value))
                {
                    xni.Current.DeleteSelf();  //报错,不支持所指定的方法,
                }
            }

ricky_syh | 园豆:0 (初学一级) | 2011-09-05 17:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册