С# Foreach XML Node
Я сохраняю 2-мерные координаты в файле 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++;
};
но теперь я получаю эту ошибку:
Msgstr "Ссылка на объект не установлена в экземпляр объекта."
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>
Пропустили несколько тегов координат, чтобы они соответствовали, но все они имели атрибут времени и начальные/конечные subtags.
Глобалы
uint counter = 0;
// Coordinates to be retrieved from the XML file.
string[][] coordinates;
Ответы
Ответ 1
Возможно, вы захотите проверить что-то вроде 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-to-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
});
Как выглядит этот список и его содержимое? Вы получаете все координаты, которые вы ожидаете?
Ответ 2
Вы могли бы использовать XmlSerialization, чтобы сделать 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);