<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的节点呢?
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}");
感谢,这个方法是可行的,但是有一个问题
我的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(); //报错,不支持所指定的方法,
}
}