<?xml version="1.0"?><aws:UrlInfoResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/"> <aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11"> <aws:UrlInfoResult><aws:Alexa><aws:ContactInfo><aws:Email>baidu_dns_master@baidu.com</aws:Email></aws:ContactInfo><aws:Alexa> </aws:UrlInfoResult> </aws:Response></aws:UrlInfoResponse>假如你要取得<aws:Email>節點,誒,你發現<aws:UrlInfoResponse>和<aws:Response>節點的命名空間馬甲是一樣的。
這個時候怎麼辦呢?難道是添加兩次aws命名空間?其實不然。做法如下:
1.我們只要添加<aws:Response>節點的命名空間。
xnm.AddNamespace("aws", "http://awis.amazonaws.com/doc/2005-07-11");
2.取得根節點,這樣我們就可以忽略根結點的命名空間,然後應用XPath取得你想要的節點。
XmlElement xe = xd.DocumentElement;XmlNodeList xnl = xe.SelectNodes("//aws:Response/aws:UrlInfoResult/aws:Alexa/aws:ContactInfo/aws:Email", xnm);
直接這樣取好像也可以:
XmlNodeList xnl = xd.SelectNodes("//aws:Response/aws:UrlInfoResult/aws:Alexa/aws:ContactInfo/aws:Email", xnm);
這樣我們就可以得到<aws:Email>節點了,然後列印出來
foreach (XmlNode xn1 in xnl){Response.Write(xn1.InnerXml.ToString() + "</br>");}
完整代碼:
XmlDocument xd = new XmlDocument();xd.Load(Server.MapPath(".")+"/a.xml");XmlNamespaceManager xnm = new XmlNamespaceManager(xd.NameTable);xnm.AddNamespace("aws", "http://awis.amazonaws.com/doc/2005-07-11");XmlElement xe = xd.DocumentElement;XmlNodeList xnl = xe.SelectNodes("//aws:Response/aws:UrlInfoResult/aws:Alexa/aws:ContactInfo/aws:Email", xnm);//XmlNodeList xnl = xd.SelectNodes(//"//aws:Response/aws:UrlInfoResult/aws:Alexa/aws:ContactInfo/aws:Email", xnm);foreach (XmlNode xn1 in xnl){Response.Write(xn1.InnerXml.ToString() + "</br>");}
--------------------------------------------------------
譬如要讀到DataSet中,如:
XmlDocument doc = new XmlDocument();
doc.Load(filename);
XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
xnm.AddNamespace("s", "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882");
xnm.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
XmlNode node = doc.SelectSingleNode("//xml/rs:data", xnm);
XmlNodeReader reader = new XmlNodeReader(node);
ds.ReadXml(reader);