Разбор дополнительных тегов в C # - PullRequest
0 голосов
/ 05 марта 2011

Я пытаюсь найти простой и удобный способ выполнить следующее требование.

У меня есть XML-сообщение с таким расположением:

  <persons>
    <person>
       <firstName>Mike</firstName>
       <middleName>K.</middleName>
       <lastName>Kelly</lastName>
    </person>
    <person>
       <firstName>Steve</firstName>
       <lastName>David</lastName>
    </person>
    <person>
       <firstName>Laura</firstName>
       <middleName>X.</middleName>
       <lastName>Xavier</lastName>
    </person>
  </persons>

Я хочу проанализировать этот XML с помощью выражений xPath.

persons/person/firstName
persons/person/middleName
persons/person/lastName

Моя цель - сохранить значения тегов firstName, middleName и lastName, например, в виде списка строковых объектов:

firstNameList[0] = "Mike";
firstNameList[1] = "Steve";
firstNameList[2] = "Laura";

middleNameList[0] = "K.";
middleNameList[1] = null;
middleNameList[2] = "X.";

lastNameList[0] = "Kelly";
lastNameList[1] = "David";
lastNameList[2] = "Xavier";

В моем коде C # я делаю это:

XmlNodeList firstNameNodeList = xmlDoc.SelectNodes("persons/person/firstName", nsmgr);
XmlNodeList middleNameNodeList = xmlDoc.SelectNodes("persons/person/middleName", nsmgr);
XmlNodeList lastNameNodeList = xmlDoc.SelectNodes("persons/person/lastName", nsmgr);

Проблема с этим кодом в том, что для второго имени его нет для второго человека в моем списке XML. Таким образом, middleNameNodeList возвращает 2 значения (K. и X.), но я не знаю, отсутствует ли второе имя первого, второго или третьего лица.

Я надеялся, что API SelectNodes () предоставит идентификатор итерации или индекса, для которого повторяющийся элемент имеет заданное значение.

Пожалуйста, предложите мне самый простой способ достичь того, что мне нужно? Большое спасибо за вашу помощь, JK

Ответы [ 4 ]

2 голосов
/ 05 марта 2011

Как насчет этого?

foreach (Node person in xmlDoc.SelectNodes("persons/person", nsmgr))
{
    firstNameNodeList.Add(person.SelectSingleNode("firstName", nsmgr));
    middleNameNodeList.Add(person.SelectSingleNode("middleName", nsmgr));
    lastNameNodeList.Add(person.SelectSingleNode("lastName", nsmgr));
}
1 голос
/ 05 марта 2011

Вместо получения списка имен, попробуйте получить список person с, затем итерируйте список и получите их имена.

0 голосов
/ 05 марта 2011

Попробуйте

   <persons>
    <person>
       <firstName>Mike</firstName>
       <middleName>K.</middleName>
       <lastName>Kelly</lastName>
    </person>
    <person>
       <firstName>Steve</firstName>
       <middleName /> 
       <lastName>David</lastName>
    </person>
    <person>
       <firstName>Laura</firstName>
       <middleName>X.</middleName>
       <lastName>Xavier</lastName>
    </person>
  </persons>

<person>
   <firstName>Steve</firstName>
   <middleName /> 
   <lastName>David</lastName>
</person>

это должно вернуть "K", "", "X" для InnnerText

0 голосов
/ 05 марта 2011

Вам просто нужно перебрать persons/person и обработать каждый в отдельности - это будет работать:

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@"test.xml");
var persons = xmlDoc.SelectNodes("persons/person");
foreach (XmlNode person in persons)
{
    string firstName = person.SelectSingleNode("firstName").InnerText;
    string middleName = (person.SelectSingleNode("middleName") != null) 
                        ? person.SelectSingleNode("middleName").InnerText 
                        : null;
    string lastName = person.SelectSingleNode("lastName").InnerText;
}
...