docNav = new XPathDocument(filePath); nav = docNav.CreateNavigator(); NodeIter = nav.Select(Expr1);
Character character = new Character(); while (NodeIter.MoveNext()) { character.Name = NodeIter.Current.Value; } --------------------------------------------------------------
Nu er problemet jo at jeg har flere xpath udtryk, som hver henter noget data, jeg skal sætte ind i mit Character objekt, og at gentage alt dette virker forkert. Desuden virker det heller ikke smart at lave en lille privat metode, der ordner det.
Der må da være en bedre måde at læse noget xml data ind i et objekt på.
Hmmmm det eksempel jeg lige kan finde, skal jeg angive en TypeOf...problemet er bare at det er stort xml dokument, hvoraf jeg blot skal bruge en lille del. Så jeg har ikke et naturligt objekt, som jeg kan 'mappe' xml data over. Hvis man kan gøre det uden at angive et specifikt objekt, så må jeg prøve med XPath eksemplet.
Generelt er min erfaring at XML deserialization sjældent kan betale sig, med mindre XML dokumentet rent faktisk svarer til en af dine kendte klasser.
Du kan jo f.eks. lave en XPath der henter alle result noder - og derefter lave en metode som læser hver enkelt stykke data fra XML filen. Så er dit "overhead" ved at skrive konverteringen manuelt, begrænset.
Jeg har nu valgt at udpege et segment af min xml kode og vil nu matche mine ting med mit objekt
XPathNavigator nav2 = iterator.Current.Clone(); character.Name = nav2.???; <- hvad kan man skrive her for at ramme lige nøjagtig <CharacterName>Navn</CharacterName> delen i min xml?
using System; using System.Collections.Generic; using System.Xml;
namespace E { public class Data { public string A { get; set; } public string B { get; set; } public override string ToString() { return "[" + A + "," + B + "]"; } } public class Program { public static void Main(string[] args) { List<Data> lst = new List<Data>(); XmlDocument doc = new XmlDocument(); doc.Load(@"C:\big.xml"); foreach(XmlNode n in doc.SelectNodes("//all/rec/obj")) { lst.Add(new Data{ A=n.SelectSingleNode("a/text()").Value, B=n.SelectSingleNode("b/text()").Value}); } foreach(Data d in lst) { Console.WriteLine(d); } Console.ReadKey(); } } }
Jeg har lavet en statisk hjælpe klasse, der holder alle mine XPath udtryk som returneres som properties. I min anden klasse har jeg lavet en lille privat metode, der tager et XPath udtryk, og Xml dokument referencen som argument, og herfter returnerer det mig lige det, jeg har behov for. :)
Smid gerne et svar ind, da jeg i det mindste har fået noget inspiration.
Jeg har nu et andet spørgsmål... Er det ikke muligt at lave et hieraki af statiske klasser?
Fx har jeg en statisk klasse, der hedder XPathHelper, hvori alle mine Xpath udtryk står i. Jeg kunne dog tænkte mig at inddele mine udtryk. Fx. kunne det være lækkert at kunne skrive:
Ideen er at jeg i min XPathHelper klasse på en eller anden måde kan angive 'Character' og 'Skill' som properties, hvor jeg kun bruger get. Get returnerer mig så fx. Character relaterede udtryk.
public static class XPathHelper{ /// <summary> /// Gets the xpath expression for the characterId. /// </summary> public static string CharacterId { get { return "/result/characterID/text()"; } } /// <summary> /// Gets the xpath expression for the skilldescription. /// </summary> public static string CharacterId { get { return "/result/skillDescription/text()"; } } }
De to forskellige Xpath udtryk vil jeg placere i henholdsvis en 'CharacterXPath' og en 'SkillXPath' som begge to er statiske. I min XPathHelper, vil jeg så gerne have dem ind som proporties....noget a la:
public static class XPathHelper{ /// <summary> /// Gets the character xpath. /// </summary> public static CharacterXPath CharacterXPath { get { return ????? } } /// <summary> /// Gets the xpath for skill. /// </summary> public static SkillXPath skillXPath { get { return ???? } } }
Mine udtryk vil naturligvis stå i to filer nu, men kan tilgås via: XPathHelper.Character.Name XPathHelper.Skill.Description
Er meget spændt på at høre hvordan jeg kan få lavet det. Det vil strukturere mine udtryk endnu bedre, istedet for at have een fil med dem alle sammen i (der er mange).
public class DinRigtigeKlasse { public static class FoersteGruppe { public static string MethodA ... public static string MethodB ... } public static class AndenGruppe { public static string MethodC ... public static string MethodD ... } ... // bruge f.eks. AndenGruppe.MethodC }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.