циклический просмотр элементов с использованием xPath - PullRequest
3 голосов
/ 03 июня 2009

Я пытаюсь перебрать документ XML и все еще получаю первый элемент во второй итерации, не зная, что мне не хватает. Кто-нибудь может помочь? Довольно новый с 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>BUR@Eaglerider.com</counterEmail>
    <directEmail>DJ@Eaglerider.com</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>ORD@Eaglerider.com</counterEmail>
    <directEmail>Dave@Eaglerider.com</directEmail>
  </location>  
</locations>

Ответы [ 3 ]

12 голосов
/ 03 июня 2009

Вы фактически игнорируете значение 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 голосов
/ 03 июня 2009

вы должны сделать:

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

Когда вы делаете xPathNavigator.Select ("// location / *")), вы уже находитесь внутри / location / location, поэтому вам нужно переместить только один элемент вниз по узлу, ячейку в вашем примере.

0 голосов
/ 03 июня 2009

Попробуйте следующее:

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

Просто быстрый взрыв, надеюсь, он тебе поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...