2017-02-02 2 views
0

Что бы быть лучшим способом для разбора XML, такие как:Наиболее элегантный способ проанализировать данные XML и обрабатывать значения элементов пользовательского массива в C#

<?xml version=""1.0"" encoding=""utf-8"" ?> 
     <shapeTemplate> 
      <vertex_contours> 
       <vertex_contour> 
        <data>1 2 3 4 5 ... </data> 
       </vertex_contour> 
       ... 
      </vertex_contours> 

     </shapeTemplate> 

Мои инстинкты говорят мне, что я должен использовать C# десериализации и использования XmlSerializer, например :

[Serializable] 
[XmlRoot("shapeTemplate")] 
public class ShapeTemplate 
{ 
    [XmlArray("vertex_contours")] 
    [XmlArrayItem("vertex_contour", typeof(VertexContour))] 
    public VertexContour[] VertexContours { get; set; } 
} 

Но потом я понял, XmlSerializer не мог просто разобрать и преобразовать < данные > в IEnumerable <INT>

Так мне было интересно, что предложенный подход к обработке такой ситуации. Первоначально я использовал XElement.Parse (...), но я надеялся, что будет более элегантное решение, чем это.

+0

Хотя это правда, что 'XmlSerializer' не могу сериализации/десериализации из/в' 'IEnumerable вы можете реализовать' IXmlSerializable'-интерфейс себя и для чтения/записи ваших данных , Для получения дополнительной информации см. Https://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly. – HimBromBeere

+0

Действительно, IXmlSerializable выполняет то, что я ищу, единственный вопрос заключается в том, лучше или хуже этот подход, чем использование Linq для Xml ... – zman

+0

Получение элементов массива является сложным, потому что у вас нет тега для каждого элемента в XML , Поэтому вам нужно разобрать его самостоятельно. Можете ли вы добавить тег для каждого элемента? – KernelMode

ответ

0

Использование XML LINQ:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      string values = (string)doc.Descendants("data").FirstOrDefault(); 

     } 
    } 

} 
+0

Да, это то, что я делал изначально, но мне не нравилось, что мне нужно было создать и инициализировать соответствующие классы самостоятельно. Я думал, что могу использовать XmlSerializer, чтобы выполнить большую часть этой работы для меня ... – zman

+0

Вы не указали, какие теги вам нужны. – jdweng

+1

Хотя этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, почему и/или как этот код отвечает на вопрос, улучшает его долгосрочную ценность. – Amy

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