Циклический просмотр XML-документа и назначение данных в переменных C # - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть XML-файл, который имеет несколько тегов, подобных этому:

<sitecollection name="">
  <site name="">
    <maingroup name=""> 
       <group name=""> </group>
    </maingroup> 
   </site>
<sitecollection>

Идея состоит в том, чтобы перебрать все sitecollection и его дочерние элементы в документе XML и сохранить информацию в переменных,У меня проблема с сохранением дочерних элементов с их атрибутами.

Пока у меня есть следующий код:

class xmlreader
{
    public static void Main()
    {
        XDocument xdoc = XDocument.Load("xmldocument.xml");
        var result = new System.Text.StringBuilder();
        var lv1s = from lv1 in xdoc.Descendants("sitecollection")
                   select new
                   {
                       siecollection = lv1.Attribute("name").Value,
                       maingroup = lv1.Descendants("group")

                   };
        foreach (var lv1 in lv1s)
        {
            result.AppendLine(lv1.siecollection);
            foreach (var lv2 in lv1.maingroup)
                result.AppendLine("   " + lv2.Attribute("name").Value);
        }

    }
}

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Если предоставленный вами образец XML верен, проблема, скорее всего, в том, что у вас нет закрывающего тега для коллекции сайтов.

Я попробовал ваш код с немного измененным вводом XML (закрыл тег sitecollection и добавил некоторые значения к атрибутам имени, чтобы в результате StringBuilder было что-то собирать) следующим образом:

XDocument xdoc = XDocument.Parse(@"<sitecollection name=""collectionName"">
    <site name=""sitename"">
    <maingroup name=""maingroupname""> 
    <group name=""groupname""> </group>
    </maingroup> 
    </site>
    </sitecollection>
    ");

и result.ToString () создает: "collectionName \ r \ n groupname \ r \ n"

0 голосов
/ 28 декабря 2011

Возьми это, где ты будешь:

  XmlReader reader = XmlReader.Create(@"C:\file.xml", null);
  StringBuilder result = new StringBuilder();
  while (reader.Read())
  {            
      if( reader.NodeType == XmlNodeType.Element)
      {
          if (reader.HasAttributes) 
          {
              result.AppendLine(reader.LocalName);
              reader.MoveToFirstAttribute();
              result.AppendLine("  " + reader.Value);                    
          }
       }                      
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...