02. november 2004 - 09:36
Der er
24 kommentarer og 1 løsning
Rediger XML dokument
Hej Jeg har kun svagt kigget på XML muligheden i C#. Men kan da lave og læse fra et XML-dokument. Men hvordan redigerer man et XML dokument fra C#? Hvis jeg nu skal ind og redigere de enkelte elementer og attributter ? Jeg kunne godt tænke mig et kodeeksmepel. Skal lige siges at jeg bruge .NET Compact Framework hvis det skulle have nogen betydning.
Annonceindlæg fra Computerworld
AI-agenterne kommer vrimlende
Virksomheder er på vej fra store sprogmodeller, der svarer på spørgsmål, til AI-agenter, der kan udføre opgaver på egen hånd. Det gør teknologien mere nyttig – og langt mere risikabel.
02. november 2004 - 10:00
#1
Du har et DOM træ og det er stort set ligesom et DOM træ i andre sprog, Eksempel: using System; using System.Xml; class MainClass { public static void Main(string[] args) { XmlDocument doc = new XmlDocument(); doc.Load("C:\\test.xml"); doc.Save(Console.Out); XmlNodeList elements = doc.GetElementsByTagName("en"); foreach(XmlNode element in elements) { XmlNodeList subelements = element.ChildNodes; for(int i = subelements.Count - 1; i >= 0 ; i--) { element.RemoveChild(subelements[i]); } XmlNode add = doc.CreateElement("d"); add.AppendChild(doc.CreateTextNode("slettet")); element.AppendChild(add); } doc.Save(Console.Out); } }
02. november 2004 - 10:11
#2
har brugt dette til at skrive nogle options til en xml fil i compact framework: public void SetOptions() { XmlDocument xmlDoc = new XmlDocument(); string path = System.IO.Path.GetDirectoryNameSystem.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase ); xmlDoc.Load(new FileStream(path + "\\config.xml", FileMode.Open)); XmlNode root = xmlDoc.DocumentElement; XmlNodeList nodes = root.ChildNodes; foreach(XmlNode node in nodes) { XmlElement currentElement = (XmlElement)node; if (currentElement.HasAttributes) { foreach(XmlAttribute att in currentElement.Attributes) { string name = att.Name; switch (name) { case "username": currentElement.SetAttribute(name, textBox1.Text); MessageBox.Show(currentElement.Attributes["username"].Value); break; case "password": currentElement.SetAttribute(name, textBox2.Text); break; case "StartOptionsPage": if (chkbxStartPage.Checked) { CurrentElement.SetAttribute(name, "true"); } else { currentElement.SetAttribute(name, "false"); } break; } } } } xmlDoc.Save(path + "\\config.xml"); }
02. november 2004 - 11:15
#3
Super - det ser godt ud. Jeg vil teste og vende tilbage med svar.
02. november 2004 - 13:27
#4
Jeg har aldrig rodet med DOM, så det er lidt svært for mig at forstå hvad der sker, en der kan forklare det kort ? Jeg har et XML dokument der eks kunne se sådan ud: <?xml version="1.0" encoding="utf-8"?> <Setup> <FirstValue>1</FirstValue> <SecondValue>name</SecondValue> </Setup> Kan I prøve og lave et eks. til - Redigere FirstValue til anden værdi - Tilføje ThirdValue i slutningen inde i Setup. - Slette SecondValue
02. november 2004 - 13:29
#5
det dokument som benyttes i mit eksempel ser således ud: <?xml version="1.0" encoding="utf-8" ?> <configuration> <setting username="CustName"></setting> <setting password="password"></setting> <setting StartOptionsPage="true"></setting> </configuration>
02. november 2004 - 13:31
#6
i din beskrivelse er Setup din rod node og FirstValue samt SecondValue er børn af denne
02. november 2004 - 13:33
#7
Med sådan nogle indstilliger, er det så bedst at gemme det som attributter eller som streng i elementet ? Og kan du forklare / ændre dit eks så det matcher elementes streng i stedet for attributten ?
02. november 2004 - 13:37
#8
nu valgte jeg at benytte attributter fordi det skulle være nemt at bladre i til en meget lille applikation. Hvad du benytter er oftest en smagssag... Jeg lavede bare noget som lignede app.config, som ikke findes i compact framework.
02. november 2004 - 13:39
#9
InnerText (inherited from XmlNode) Supported by the .NET Compact Framework. Gets or sets the concatenated values of the node and all its child nodes. Ovenstående metode kan bruges til at hente strengen fra en node, prøv bare at lave en foreach løkke som læser teksten i dine noder og skriver en besked til dig, så er det lidt nemmere at overskue
02. november 2004 - 13:42
#10
den kode jeg postede er bare et eksempel jeg har brugt engang, men jeg har ikke mulighed for at lave det om lige nu, men det er ikke så vanskeligt. Du skal bare forsøge dig frem til at starte med
02. november 2004 - 14:13
#11
Ja det ser ok ud, man skal bare lige forstå hvordan det er bygget op. Hvad er argumentet til xmlDoc.Save(??); Jeg har prøvet med filnavnet som du har det, men det virker ikke, den kommer med en IOexception?
02. november 2004 - 14:23
#12
har du husket at tage højde for hvor din fil skal ligge (jeg bruger jo en sti lokalt i forhold til hvor min applikation kører?
02. november 2004 - 14:26
#13
02. november 2004 - 15:34
#14
Jeg har prøvet dette her: (+ et par forskellige andre) - men jeg kan ikke få det til at virke. Den melder IOException på save() string xmlfilename = @"\setup.xml"; XmlDocument doc = new XmlDocument(); doc.Load(xmlfilename); //doc.Load(xmlfilename); XmlNode root = doc.DocumentElement; XmlNodeList nodes = root.ChildNodes; foreach( XmlNode node in nodes ) { MessageBox.Show(node.InnerText,node.Name); node.InnerText = "2"; } doc.Save(xmlfilename); Og stien er rigtig nok da det er en mobile device ( ligenu dog kun emulatoren ) Hvad er galt ?
02. november 2004 - 15:44
#15
er det kun i save den fejler, ikke i load?
02. november 2004 - 15:45
#16
prøv i øvrigt at nøjes med "setup.xml" som navn og ikke andet
02. november 2004 - 15:53
#17
I save() ja og ikke load. Virker hellere ikke med kun setup.xml.
03. november 2004 - 09:37
#18
OK fandt fejlen. Min kode var i en try...catch hvor jeg åbnede filen med xmltextreader højere oppe, og fordi den fanger exception blev den ikke lukket. Kigger lidt videre på det.
03. november 2004 - 10:48
#19
Hvordan tilføjer jeg en child i slutningen af setup elementet ? (ThirdValue) <?xml version="1.0" encoding="utf-8"?> <Setup> <FirstValue>1</FirstValue> <SecondValue>name</SecondValue> </Setup> Har prøvet det her: XmlDocument doc = new XmlDocument(); doc.Load("setup.xml"); XmlNode root = doc.DocumentElement; XmlNodeList nodes = root.ChildNodes; XmlNode newnode = doc.CreateNode(XmlNodeType.Text,"name","namespace"); root.AppendChild(newnode); doc.Save("setup.xml"); Men den ændrer intet i xml dokumentet.
03. november 2004 - 14:45
#20
altså: setup first second third /setup ?
03. november 2004 - 14:51
#21
prøv lige med root.firstchild.append... (ret selv med parenteser og capitaler)
03. november 2004 - 15:55
#22
Ja sådan. Har ikke testet dig forslag - men fik det til at virke med: int setupindex=0; for (int i=0;i<doc.ChildNodes.Count;i++) { if ( doc.ChildNodes.Item(i).Name == "Setup" ) setupindex=i; } XmlElement xmlelem = doc.CreateElement("","ThirdValue",""); XmlText xmltext = doc.CreateTextNode("value"); xmlelem.AppendChild(xmltext); doc.ChildNodes.Item(setupindex).AppendChild(xmlelem); doc.Save(xmlsetup.XmlFilename); Jeg kæmper lidt videre :-) ladyhawke>> Du må gerne smide et svar.
03. november 2004 - 16:24
#23
OK, men du er velkommen til at spørg hvis det kniber... Jeg er bare lige igang med noget arbejde, så jeg havde ikke lige tid til at tjekke det 100%
03. november 2004 - 16:33
#24
ja ja det er skam helt i orden :-) Man forstår lige lidt ekstra når man skal forske selv, så det er godt nok :-) Tak for hjælpen
03. november 2004 - 18:45
#25
velbekomme, sig bare til igen hvis der er spørgsmål :o)
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.