Узел C# Foreach XML

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

<?xml version="1.0" encoding="utf-8" ?> 
<grid>
<coordinate time="78">
<initial>540:672</initial> 
<final>540:672</final> 
</coordinate>
</grid>

Я могу открыть XML-файл и считать его через XmlTextReader, но как делают я циклично выполняюсь через координаты конкретно для получения и атрибута времени и данных между начальными и заключительными узлами в некотором формате, подобном:

string initial = "540:672";
string final  = "540:672";
int time = 78;

Новый код:

Мой новый код:

//Read the XML file.
XDocument xmlDoc = XDocument.Load("C:\\test.xml");

foreach (var coordinate in xmlDoc.Descendants("coordinate"))
{
    this.coordinates[this.counter][0] = coordinate.Attribute("time").Value;
    this.coordinates[this.counter][1] = coordinate.Element("initial").Value;
    this.coordinates[this.counter][2] = coordinate.Element("final").Value;
    this.counter++;
};

но теперь я получаю эту ошибку:
"Ссылка на объект не набор к экземпляру объекта".


XML

<?xml version="1.0" encoding="utf-8"?>
<grid>
  <coordinate time="62">
    <initial>540:672</initial>
    <final>540:672</final>
  </coordinate>

  ...

  <coordinate time="46">
    <initial>176:605</initial>
    <final>181:617</final>
  </coordinate>
</grid>

Пропущенный несколько координат отмечают для установки, но у них всех были атрибут времени и начальные/окончательные подтеги.


Globals

uint counter = 0;

        // Coordinates to be retrieved from the XML file.
        string[][] coordinates;
11
задан Gio Borje 27 January 2010 в 09:07
поделиться

2 ответа

Вы можете захотеть проверить что-то вроде linq-to-xml:

XDocument coordinates = XDocument.Load("yourfilename.xml");

foreach(var coordinate in coordinates.Descendants("coordinate"))
{
    string time = coordinate.Attribute("time").Value;

    string initial = coordinate.Element("initial").Value;
    string final = coordinate.Element("final").Value;

    // do whatever you want to do with those items of information now
}

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

см. здесь или здесь [] (или множество других мест) для введения в Linq-to-XML.


Обновление:

Пожалуйста, попробуйте этот код - если он работает, и вы получаете все координаты в этом результирующем списке, то код Linq-XML в порядке:

Определите новый класс помощника:

public class Coordinate
{
    public string Time { get; set; }
    public string Initial { get; set; }
    public string Final { get; set; }
}

И в вашем главном коде:

XDocument xdoc = XDocument.Load("C:\\test.xml");
IEnumerable<XElement> cords= xdoc.Descendants("coordinate");

var coordinates = cords
                  .Select(x => new Coordinate()
                                   {
                                      Time = x.Attribute("time").Value,
                                      Initial = x.Attribute("initial").Value,
                                      Final = x.Attribute("final").Value
                                    });

Как этот список и его содержание выглядят ?? Вы получаете все координаты, которые вы ожидаете ??

25
ответ дан 3 December 2019 в 04:13
поделиться

Вы могли бы использовать XMLSerization, чтобы сделать XML в простой список классов координат с небольшим количеством работы, например,

    public class coordinate
    {
        [XmlAttribute]
        public int time;
        [XmlElement(ElementName="initial")]
        public string initial;
        [XmlElement(ElementName = "final")]
        public string final;

        public coordinate()
        {
            time = 0;
            initial = "";
            final = "";
        }
    }

    public class grid
    {
        [XmlElement(ElementName="coordinate", Type = typeof(coordinate))]
        public coordinate[] list;

        public grid()
        {
            list = new coordinate[0];
        }
    }     

Тогда в вашем коде:

XmlReader r = new XmlReader.Create(...);
grid g = (grid) new XmlSerializer(typeof(grid)).Deserialize(r);
0
ответ дан 3 December 2019 в 04:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: