2016-06-28 5 views
-2

Я пытался читать xml в Visual Studio C#, но не знал, как сделать это очень хорошо. Во-первых, я попробовал, если блок, как это:Как читать xml-файл (легко)

if (ReadToNextDescendant("painted_blue")) 
{ 
    // access the coordinates inside and do some work 
    // this works 
} 

Он работал, и я был в состоянии извлечь данные из нарисованных синих координат. Тем не менее, я попробовал это снова для wall_horizontal, и это не сработало. Таким образом, я пришел к выводу, что мне нужна какая-то новая функция или, возможно, другой подход. Тем не менее, я не разбираюсь в разборе XML. Во-первых, я не понимаю, что делает ReadToDescendant и почему он не работает во второй раз. Может ли кто-нибудь указать мне в правильном направлении?

<painted_blue> 
    (0,0) 
    (1,0) 
    (1,5) 
    (2,2) 
</painted_blue> 

<walls_horizontal> 
    (1,2) 
    (1,3) 
    (1,4) 
    (2,1) 
    (2,2) 
</walls_horizontal> 

<walls_vertical> 
    (1,1) 
    (1,2) 
    (1,3) 
    (2,0) 
    (2,1) 
</walls_vertical> 

+9

Похоже, что «ReadToNextDescendant» - это метод в вашем собственном классе, учитывая, что вы его не называете. Это действительно поможет, если вы предоставите [mcve]. Но в целом я бы предложил использовать LINQ to XML при работе с XML. Нынешняя структура вашего XML действительно неудачна, хотя, похоже, каждый из этих элементов должен иметь 5 подэлементов. –

+1

Посмотрите класс XElement. Это очень полезно для такого рода вещей и является частью того, о чем говорит Джон Скит, когда он говорит о LINQ to XML. Вы также должны учитывать, как говорит Джон Скит, исправление вашего XML, чтобы эти координаты были подэлементами, возможно, с атрибутами x и y. – Jakotheshadows

+0

Стоит отметить, добавив: ваш XML недействителен XML. –

ответ

1

Если вы можете я действительно предлагаю изменить формат XML-то вроде этого:

<walls_horizontal> 
    <coord x="1" y="2" /> 
    <coord x="1" y="3" /> 
    <coord x="1" y="4" /> 
</walls_horizontal> 

Имея узлы для координат будет сделать намного проще справляться.

Вот код

public static XmlReaderSettings ReaderSettings() 
{ 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.CloseInput = true; 
    settings.IgnoreComments = true; 
    settings.IgnoreProcessingInstructions = true; 
    settings.IgnoreWhitespace = true; 
    return settings; 
} 

... где бы вы читали в файле

Stream stream = File.Open(filePath, FileMode.Open); 

    var reader = XmlReader.Create(stream, XmlHelper.ReaderSettings()); 



    if (!reader.IsEmptyElement) 
      { 
       string tagName = reader.Name; 

       while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement)) 
       { 
        if (reader.NodeType == XmlNodeType.Element) 
        { 
         switch (reader.Name) 
         { 
          case "wall_horizontal": 
           var coord = new Coord(reader); 
           break; 

         } 
        } 
       } 
      } 

В обычае скоординировать класс сделать что-то вроде:

public Coord(XmlReader reader) 
    { 
     if (reader == null) throw new ArgumentNullException("reader"); 

     if (!reader.IsEmptyElement) 
     { 
      string tagName = reader.Name; 

      while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement && reader.Name == "coord")) 
      { 
       if (reader.NodeType == XmlNodeType.Element) 
       { 
        switch (reader.Name) 
        { 
         case "coord": 
          var x = reader.GetAttribute("x"); 
          var y = reader.GetAttribute("y"); 
          break; 
        } 
       } 

     } 
     } 
    } 

Затем сделайте что-то с вашими значениями x и y. Этот код является плитой котла для использования. Для работы с кодом может потребоваться некоторое изменение. Надеюсь, это указывает на то, что вы в правильном направлении!

Смежные вопросы