Avatar billede htm Nybegynder
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.
Avatar billede arne_v Ekspert
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);
        }
}
Avatar billede ladyhawke Novice
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");       
  }
Avatar billede htm Nybegynder
02. november 2004 - 11:15 #3
Super - det ser godt ud. Jeg vil teste og vende tilbage med svar.
Avatar billede htm Nybegynder
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
Avatar billede ladyhawke Novice
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>
Avatar billede ladyhawke Novice
02. november 2004 - 13:31 #6
i din beskrivelse er Setup din rod node og FirstValue samt SecondValue er børn af denne
Avatar billede htm Nybegynder
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 ?
Avatar billede ladyhawke Novice
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.
Avatar billede ladyhawke Novice
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
Avatar billede ladyhawke Novice
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
Avatar billede htm Nybegynder
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?
Avatar billede ladyhawke Novice
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?
Avatar billede htm Nybegynder
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 ?
Avatar billede ladyhawke Novice
02. november 2004 - 15:44 #15
er det kun i save den fejler, ikke i load?
Avatar billede ladyhawke Novice
02. november 2004 - 15:45 #16
prøv i øvrigt at nøjes med "setup.xml" som navn og ikke andet
Avatar billede htm Nybegynder
02. november 2004 - 15:53 #17
I save() ja og ikke load.

Virker hellere ikke med kun setup.xml.
Avatar billede htm Nybegynder
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.
Avatar billede htm Nybegynder
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.
Avatar billede ladyhawke Novice
03. november 2004 - 14:45 #20
altså:
setup
  first
  second
  third
/setup

?
Avatar billede ladyhawke Novice
03. november 2004 - 14:51 #21
prøv lige med root.firstchild.append... (ret selv med parenteser og capitaler)
Avatar billede htm Nybegynder
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.
Avatar billede ladyhawke Novice
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%
Avatar billede htm Nybegynder
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
Avatar billede ladyhawke Novice
03. november 2004 - 18:45 #25
velbekomme, sig bare til igen hvis der er spørgsmål :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester