Чтение узла Xml для каждого цикла

Я пытаюсь просмотреть файл Xml и отобразить значение для учетной записи в сообщении.

XmlNodeList nodeList = testDoc.SelectNodes("/details/row/var");
foreach (XmlNode no in nodeList)
{
   XmlNode node = testDoc.SelectSingleNode("/details/row/var[@name='account']");
   test.actual = node.Attributes["value"].Value;

   MessageBox.Show(test.account);
 }

Окно сообщения в настоящее время постоянно отображает первую запись, как я могу перейти к следующей записи?

Спасибо за ваш вклад заранее.


person Ebikeneser    schedule 10.01.2011    source источник
comment
Вы не используете переменную no, значение которой на каждой итерации будет одной отправной точкой.   -  person Aaron McIver    schedule 10.01.2011


Ответы (6)


Вы неоднократно назначаете node одному и тому же элементу из testDoc. Непонятно, что такое test.account (возможно, опечатка для test.actual)?

no - это переменная, которая будет повторять содержимое nodeList - я полагаю, вы намеревались использовать это.

EDIT после редактирования OP Теперь вы показали нам, что такое nodeList, я подозреваю, что вместо этого вы хотите сделать что-то вроде этого:

XmlNodeList nodeList = testDoc.SelectNodes("/details/row/var[@name='account']"); 
foreach (XmlNode no in nodeList) 
{    
   test.actual = no.Attributes["value"].Value;
   ...
person Chris Dickson    schedule 10.01.2011

Вот пример значения родительского узла для получения информации о дочерних узлах. Здесь я использую дочерние узлы ReportItems ParentNode и Print only image.

        xmldoc.Load(rdlFile);
        StringBuilder sb=new StringBuilder();
        XmlNode node = xmldoc.GetElementsByTagName("ReportItems")[0];
        XmlNodeList list = node.ChildNodes;
        atributes=new string[node.ChildNodes.Count];
        int  l = 0;
        for (int j = 0; j < node.ChildNodes.Count; j++)
        {


            if (list[j].Name == "Image")
            {
                XmlAttributeCollection att = list[j].Attributes;
                atributes[l] = att[0].Value.ToUpper();

            }
            l++;
        }
        for (int i = 0; i < node.ChildNodes.Count; i++)
        {
            if (searchText.Text.ToUpper() == atributes[i])
            {
                XmlNodeList lastlist = node.ChildNodes;
                XmlNodeList endlist = lastlist[i].ChildNodes;
                for (int k = 0; k < endlist.Count; k++)
                {
                    sb.Append(endlist[k].Name+" - "+ endlist[k].InnerText);
                    sb.Append("\n"+"\n");
                }

            }

        }

дайте мне знать, если у вас есть сомнения ..

person Ramnivas    schedule 31.12.2011

Попробуй это,

XmlDocument xdoc = new XDocument();

xdoc.Load("*/File/*"); 
string xmlcontents = xdoc.InnerXml;

var xpath = "(/details/row/var[@name='account'])";

XmlNodeList lists = xdoc.DocumentElement.SelectNodes(xpath);

foreach (XmlNode _node in lists)
{
    string _nodeValue = _node.InnerText;
    MessageBox.Show(_nodeValue);
}
person Mishra Saurabh    schedule 21.01.2014

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

        //Create an xml reader;
        XmlDocument _xmlDocument = new XmlDocument();
        _xmlDocument.Load(/*File Name here*/);

        //Select the element with in the xml you wish to extract;
        XmlNodeList _nodeList = _xmlDocument.SelectNodes("/details/row/var[@name='account']");

        //Display the values in the node list to the screen;
        foreach (XmlNode _node in _nodeList)
        {
            String _nodeValue = _node.InnerText.ToString();
            MessageBox.Show(_nodeValue.ToString());
        }
person BigCheekyBird    schedule 10.01.2011

Я не уверен на 100%, но вам может понадобиться использовать рекурсию. Если нет, то это должно выглядеть так:

XmlDocument doc = //etc..
foreach(XmlNode node in doc.ChildNodes)
{
    if(node.Name == "account")
    {
        MessageBox.Show(node.Value);
    }
}
person ferr    schedule 10.01.2011
comment
Мне нужно было внимательно прочитать весь пост... отредактировать, чтобы я мог отменить -1. Кроме того, я до сих пор не вижу причин, по которым OP будет использовать рекурсию - XPath уже выбирает узлы настолько глубоко, насколько это необходимо... - person Alexei Levenkov; 10.01.2011

Вы не должны тратить время на чтение узла xml по узлу. Попробуйте выполнить десериализацию:

person Pabuc    schedule 10.01.2011
comment
-1 : Это полностью зависит от того, как выглядит информационный набор XML и что он пытается с ним сделать. Десериализация в тип может потребовать много ненужной работы как во время разработки, так и во время выполнения, или даже может оказаться невозможной. - person Chris Dickson; 10.01.2011
comment
@Chris ~ лучшая практика всегда лучше любой другой практики. Просто хотел, чтобы ОП знал, что десериализация действительно существует. Если бы я задавал этот вопрос, я бы сказал, что меня не интересует десериализация, поскольку xml слишком сложен, и мне просто нужна небольшая часть, которой он не сделал. - person Pabuc; 10.01.2011