Разбор XML в C # - PullRequest
       58

Разбор XML в C #

1 голос
/ 22 октября 2009

Я ищу способ прочитать следующий XML

<Data>
  <MaxCount>10</MaxCount>
  <Points>
    <Point X="10" Y="10"/>
    <Point X="20" Y="10"/>
    <Point X="30" Y="10"/>
    <Point X="40" Y="10"/>
    <Point X="50" Y="10"/>
    <Point X="60" Y="10"/>
  </Points>
</Data>

По сути, я хочу прочитать все значения точек в массив объектов Point (у моего объекта point есть 2 свойства X и Y) и MaxCount в целое число. Каков наилучший способ извлечь значения Point из файла XML с помощью C #?

Спасибо

Ответы [ 5 ]

8 голосов
/ 22 октября 2009

Я предлагаю вам взглянуть на класс XmlSerializer. Он позволяет сериализовать и десериализовать XML непосредственно в объекты.

Во-первых, классы для представления ваших данных:

[XmlRoot(Namespace = "")]
public class Data
{
    public int MaxCount;
    public Point[] Points;
}

public class Point
{
    [XmlAttribute]
    public int X;
    [XmlAttribute]
    public int Y;
}

Затем вы используете XmlSerializer:

Stream s = ... // Some code to open you file into a stream

var serializer = new XmlSerializer(typeof(Data));
Data d = (Data)serializer.Deserialize(s);

Артикул: http://msdn.microsoft.com/en-us/library/ms950721.aspx

4 голосов
/ 22 октября 2009
    class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

    static int Main(string[] args)
    {
        string xml = "<Data>  <MaxCount>10</MaxCount>  <Points>    <Point X=\"10\" Y=\"10\"/>    <Point X=\"20\" Y=\"10\"/>    <Point X=\"30\" Y=\"10\"/>    <Point X=\"40\" Y=\"10\"/>    <Point X=\"50\" Y=\"10\"/>    <Point X=\"60\" Y=\"10\"/>  </Points></Data>";

        XDocument doc = XDocument.Parse(xml);

        int maxCount = int.Parse(doc.Element("Data").Element("MaxCount").Value);

        var points = from e in doc.Element("Data").Element("Points").Elements("Point")
                     select new Point
                     {
                         X = int.Parse(e.Attribute("X").Value),
                         Y = int.Parse(e.Attribute("Y").Value)
                     };

        Console.WriteLine("MaxCount: {0}", maxCount);
        foreach (var item in points)
        {
            Console.WriteLine("Point: {0},{1}", item.X, item.Y);
        }
    }
4 голосов
/ 22 октября 2009

Ну, вы можете легко прочитать файл, используя класс XMLDocument.

http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx

По сути, вы просто должны прочитать класс в файле, а затем циклически просмотреть созданные им XMLNodes. Вы читали бы в MaxCount, используя свойство innerText узла, и когда вы переходите к циклу через его дочерние элементы и извлекаете нужные данные через свойство attribute XMLNode.

1 голос
/ 22 октября 2009

Это можно сделать с помощью XPath:

public void CreatePoints(string xml)
{
    XPathDocument doc = new XPathDocument(XmlReader.Create(new StringReader(xml)));
    var xPathNodeIterator = doc.CreateNavigator().Select("/Data/Points/Point");
    foreach (XPathNavigator node in xPathNodeIterator)
    {
        var x = node.SelectSingleNode("@X").ValueAsInt;
        var y = node.SelectSingleNode("@Y").ValueAsInt;

        new Point(x, y);
    }
}
0 голосов
/ 22 октября 2009

Создание данных класса с целочисленным свойством MaxCount и одним свойством Точки типа List (Точка - это другой класс со свойствами X и Y). Отметьте эти классы как Сериализуемые.

Загрузка XML в XMLReader.

Десериализация Xml с использованием Xmlreader в класс Data.

Извините, что не предоставил рабочий пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...