2009-06-03 198 views
3

我尝试通过xml文档进行循环,并且我仍然在第二次迭代中获取第一个元素,不知道我缺少什么。谁能帮忙?漂亮的新使用XPath使用xPath循环遍历项目

string file = HttpContext.Current.Server.MapPath("~/XML/Locations.xml"); 

    Dictionary<string, Location> locationCollection = new Dictionary<string, Location>(); 

     XPathDocument xDocument = new XPathDocument(file); 
     XPathNavigator xPathNavigator = xDocument.CreateNavigator(); 

     foreach (XPathNavigator node in xPathNavigator.Select("//locations/*")) 
     { 
      string value = node.SelectSingleNode("/locations/location/cell").Value; 
     } 



    <?xml version="1.0" encoding="utf-8" ?> 
<locations> 
    <location> 
    <locationName>Glendale</locationName> 
    <street>3717 San Fernando Road</street> 
    <city>Glendale</city> 
    <state>CA</state> 
    <zipcode>91204</zipcode> 
    <generalManager>DJ Eldon</generalManager> 
    <phone>(818) 552‐6246</phone> 
    <tollFree>(888) 600‐6011</tollFree> 
    <fax>(818) 552‐6248</fax> 
    <cell>(347) 834‐2249</cell> 
    <counterEmail>[email protected]</counterEmail> 
    <directEmail>[email protected]</directEmail> 
    </location> 
    <location> 
    <locationName>Chicago</locationName> 
    <street>1301 S. Harlem Ave.</street> 
    <city>Chicago</city> 
    <state>IL</state> 
    <zipcode>60402</zipcode> 
    <generalManager>Dave Schnulle</generalManager> 
    <phone>(708) 749‐1500</phone> 
    <tollFree>(888) 966‐1500</tollFree> 
    <fax>(818) 552‐6248</fax> 
    <cell>(708) 749‐3800</cell> 
    <counterEmail>[email protected]</counterEmail> 
    <directEmail>[email protected]</directEmail> 
    </location> 
</locations> 

回答

11

你有效地忽略利用斜线,回到文档根的node值。试试这个:

// This assumes that there are only location nodes under locations; 
// You may want to use //locations/location instead 
foreach (XPathNavigator node in xPathNavigator.Select("//locations/*")) 
{ 
    string value = node.SelectSingleNode("cell").Value; 
    // Use value 
} 

话虽如此,是否有任何理由你没有在一个XPath查询中做到这一点?

// Name changed to avoid scrolling :) 
foreach (XPathNavigator node in navigator.Select("//locations/location/cell")) 
{ 
    string value = node.Value; 
    // Use value 
} 
+0

谢谢,这工作得很好...是的,有一个原因,我没有做一个单一的xpath,因为我将添加multipule值到一个集合。 再次感谢! – BoredOfBinary 2009-06-03 16:06:36

0

尝试以下操作:

XPathNodeIterator ni = xPathNavigator.Select("//locations/*"); 
while (ni.MoveNext()) 
{ 
    string value = ni.Current.Value); 
} 

只是一个快速的脱口而出,希望它可以帮助你。

0

你应该做的:

string value = node.SelectSingleNode("./cell").Value; 

当你做xPathNavigator.Select(“//位置/ *”)),你已经在/地点/位置,所以你需要一个元素下移节点,在你的例子中的单元格。