Quote (Jason89 @ 20 Oct 2014 17:14)
Részletezd egy kicsit, ez így túl általános.
ez így tökéletesen részletes szerintem ^^
nálunk pl van xxx project amiket átvettünk más cégektől, és még nem hallottam hogy ne majmok írták volna az égetnivaló sourcet
Quote (xGurke @ 20 Oct 2014 17:17)
nem tehetem sajnos, pedig nagyon örömködnénk rajta, ha bemásoltam volna a kódot
ja és nem szeretem a rapidxml-t
btw rapidxml is DOM alapú ahogy látom, ez eléggé ilyen kategória, hogy
> RAPID
> DOM
pick one
ha tényleg rapidot akarsz, akkor azt a megközelítést használd hogy sima "text helper" osztályhoz nyúlsz, pl .net-ben az XmlReader, XmlWriter
itt van valami random kód, hogy látszódjon a lényege
mindenki utálja mert macerásabb picit, de ha config fájlnál nagyobb xml-hez kell nyúlnom tuti nem használok DOM-ot
olvasásnál kb a ReadToFollowing-on van a hangsúly, írásnál meg csak tag-writer-helperek (mint MVC-ben a HtmlHelper)
persze nincs silver bullet, de nem árt ha valaki tud erről is
Code
private void LoadVerticesFromFile()
{
Vertices.Clear();
if (!File.Exists(FileName)) return;
var childrenPostprocessCache = new List<Tuple<int, int, int>>();
using (var xml = XmlReader.Create(FileName))
{
xml.ReadToFollowing("vertices");
var verticesCount = xml.GetInt("count");
for (var i = 0; i < verticesCount; i++)
{
var vertex = new GVertex();
xml.ReadToFollowing("vertex");
vertex.State = new SimpleState()
{
Data = xml.GetInt("data"),
ID = xml.GetInt("id")
};
vertex.State.Init(this, null);
vertex.Position = new Point(xml.GetInt("x"), xml.GetInt("y"));
vertex.IsStart = xml.GetBool("start");
vertex.IsGoal = xml.GetBool("goal");
xml.ReadToFollowing("children");
var childrenCount = xml.GetInt("count");
for (var j = 0; j < childrenCount; j++)
{
xml.ReadToFollowing("child");
var target = xml.GetInt("id");
var costFromParent = xml.GetInt("c");
childrenPostprocessCache.Add(new Tuple<int, int, int>(i, target, costFromParent));
}
Vertices.Add(vertex);
}
for (var i = 0; i < childrenPostprocessCache.Count; i++)
{
var rootIndex = childrenPostprocessCache[i].Item1;
var childIndex = childrenPostprocessCache[i].Item2;
var childCostFromParent = childrenPostprocessCache[i].Item3;
Vertices[rootIndex].Children.Add(Vertices[childIndex]);
Vertices[childIndex].State.Init(this, Vertices[rootIndex].State);
Vertices[childIndex].State.CostFromParent = childCostFromParent;
}
/*for (int i = 0; i < this.Vertices.Count; i++)
{
if (this.Vertices[i].State.Parent == null)
{
this.Vertices[i].State.Init(this);//, null);
}
}*/
}
}
public void SaveVerticesToFile()
{
using (XmlWriter xml = XmlWriter.Create(FileName, new XmlWriterSettings() { Indent = true }))
{
xml.WriteStartDocument();
xml.WriteStartElement("vertices");
xml.WriteInt("count", Vertices.Count);
for (var i = 0; i < Vertices.Count; i++)
{
var vertex = Vertices[i];
xml.WriteStartElement("vertex");
xml.WriteInt("id", i);
xml.WriteInt("data", ((SimpleState)vertex.State).Data);
xml.WriteInt("x", vertex.Position.X);
xml.WriteInt("y", vertex.Position.Y);
xml.WriteBool("start", vertex.IsStart);
xml.WriteBool("goal", vertex.IsGoal);
xml.WriteStartElement("children");
xml.WriteInt("count", vertex.Children.Count);
for (var j = 0; j < vertex.Children.Count; j++)
{
var child = vertex.Children[j];
xml.WriteStartElement("child");
xml.WriteInt("id", this.Vertices.IndexOf(child));
xml.WriteInt("c", child.State.CostFromParent);
xml.WriteEndElement(); //~child
}
xml.WriteEndElement(); //~children
xml.WriteEndElement(); //~vertex
}
xml.WriteEndElement(); //~vertices
xml.WriteEndDocument();
xml.Flush();
}
}