在XML节点中加入了命名空间后,如果要用XPathDocument 查找节点,并排序,需要使用两个XPathExpression.否则排序会失败。
具体原因见微软bug: http://support.microsoft.com/kb/316656/zh-tw
<?xml version="1.0" encoding="gb2312"?>
<root xmlns="http://tempurl/data.xsd">
<student>
<name>John</name>
<age>22</age>
</student>
<student>
<name>Ang</name>
<age>21</age>
</student>
<student>
<name>Lee</name>
<age>23</age>
</student>
<student>
<name>Xu</name>
<age>25</age>
</student>
</root>
class Core
{
public static List<string> GetData()
{
XPathDocument document = new XPathDocument(@"D:/test.xml");
XPathNavigator nav = document.CreateNavigator();
List<string> list = new List<string>();
XmlNamespaceManager namespaceMgr = new XmlNamespaceManager(nav.NameTable);
namespaceMgr.AddNamespace("b", "http://tempurl/data.xsd");
string xpath = "//b:student[b:age>20]";
XPathExpression exp = nav.Compile(xpath);
exp.SetContext(namespaceMgr);
//exp.AddSort("b:age", XmlSortOrder.Descending, XmlCaseOrder.None, null, XmlDataType.Number);
XPathExpression exp2 = nav.Compile("b:age");
exp2.SetContext(namespaceMgr);
exp.AddSort(exp2, XmlSortOrder.Descending, XmlCaseOrder.None, null, XmlDataType.Number);
XPathNodeIterator iter = nav.Select(exp);
while (iter.MoveNext())
{
list.Add(iter.Current.InnerXml);
}
return list;
}
}