Я сохраняю двухмерные координаты на 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;
Вы можете захотеть проверить что-то вроде 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
});
Как этот список и его содержание выглядят ?? Вы получаете все координаты, которые вы ожидаете ??
Вы могли бы использовать 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);