Avatar billede smsng Nybegynder
12. august 2005 - 16:17 Der er 16 kommentarer og
1 løsning

Control XMLTextWriter

Hejsa...

Jeg løber en xmlfil igennem, hvor der bliver plukket nogle specifikke nodes ud til brugeren.
Jeg vil gerne have at disse nodes skal behandles af brugeren, og sendes tilbage, inden resultatet udskrives i en ny xml fil.

I Form1 har jeg:

string newfile="C:\\NyFil.xml";
XmlTextWriter tw = new XmlTextWriter(newfile, null);

tw.Formatting = Formatting.Indented;
tw.WriteProcessingInstruction("xml", "version='1.0' encoding='UTF-8'");

if(navn1==navn2)
{
tw.WriteElementString("Navn", navn1);
}
else
{
ArrList1.Add(navn1);
ArrList2.Add(navn2);    
}
if(adress1==adress2)
{
tw.WriteElementString("Adress", adress1);
}
else
{
ArrList1.Add(adress1);
ArrList2.Add(adress1);    
}

Form2 Form2 = new Form2(this);                
if(Form2.ShowDialog() == DialogResult.OK)
{
foreach(string s in Form2.arrLabel1)
{   
Console.WriteLine(s);
}
foreach(string t in Form2.arrLabel2)
{   
Console.WriteLine(t);
}

I Form2 har jeg:
lb1[i].Text = Form1.ArrList1[i].ToString();
lb2[i].Text = Form1.ArrList2[i].ToString();

Form2.button.Click +=new EventHandler(button_Click);

private void savechoose_Click(object sender, EventArgs e)
{
for(int j=0; j<cb1.Length; j++)
{
if(cb1[j].Checked)
{
Label1.Add(lb1[j].Text); //Label1 og 2 er to ArrayList
}
if(cb2[j].Checked)
{
Label2.Add(lb2[j].Text);
}
}

public ArrayList arrLabel1
{
get
{
return Form2.Label1;
}
}

public ArrayList arrLabel2
{
get
{
return Form2.Label2;
}
}

På den måde får brugeren lov til vælge navn, hvis de da ikke er ens, og bliver også sendt tilbage til Form1, hvor de bliver udskrevet i consolen.
Det er her mit problem opstår.
Hvordan sætte man brugerens valg ind igen og i de oprindelige steder??
Eks:
De to xml filer er navn1 != navn2, men adress1==adress2.
Programmet løber det igennem, brugeren vælger navn1, og det skal sættes ind, så det således ud

<navn></navn>
<adress></adress>

Håber det er til at forstå og at det giver et svar :-)
Avatar billede anadan Nybegynder
12. august 2005 - 16:28 #1
brug XmlDocument og arbejd med XmlElement, det bliver noget mere overskueligt.
Avatar billede anadan Nybegynder
12. august 2005 - 16:38 #2
Hvis du læser det hele ind i et XmlDocument kan du bare smide nogle XmlElement'er rundt by reference, og så rette i dem. Når du er færdig gemmer du bare hele dit XmlDocument igen, så er dine rettelser med.
Avatar billede smsng Nybegynder
12. august 2005 - 16:41 #3
Kan du give et eksempel på opbygningen med XmlDocument??
Avatar billede anadan Nybegynder
12. august 2005 - 16:42 #4
øjeblik
Avatar billede anadan Nybegynder
12. august 2005 - 16:45 #5
Her er et ret simpelt eksempel :

using System;
using System.Xml;


namespace XmlElements
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            XmlElement root = doc.CreateElement("root");
            XmlElement name = doc.CreateElement("name");
                name.InnerText = "fornavn";
            XmlElement address = doc.CreateElement("address");
                address.InnerText ="min adresse";
            doc.AppendChild(root);
            root.AppendChild(name);
            root.AppendChild(address);

            Console.WriteLine(doc.OuterXml);
            ChangeName(ref name);
            Console.WriteLine(doc.OuterXml);
            Console.ReadLine();
            //
            // TODO: Add code to start application here
            //
        }
        public static void ChangeName(ref XmlElement element)
        {
            element.InnerText = "nyt navn";
        }
    }
}
Avatar billede anadan Nybegynder
12. august 2005 - 16:47 #6
du kan indlæse XmlDocument med kommandoen:

doc.Load("mitXml.xml");

eller en xml string:

string xml = "<root><name>hej</name><address>adresse</address></root>";
doc.LoadXml(xml);
Avatar billede anadan Nybegynder
12. august 2005 - 16:49 #7
forresten: det første program resulterer i følgende output:

<root><name>fornavn</name><address>min adresse</address></root>
<root><name>nyt navn</name><address>min adresse</address></root>
Avatar billede smsng Nybegynder
12. august 2005 - 16:50 #8
hvad gør din..

public static void ChangeName(ref XmlElement element)
{
  element.InnerText = "nyt navn";
}
Avatar billede smsng Nybegynder
12. august 2005 - 16:51 #9
rettere sagt - hvordan ved den at der er XmlElement name og ikke XmlElement address den skal hive fat i??
Avatar billede anadan Nybegynder
12. august 2005 - 16:51 #10
Metoden får et XmlElement med som reference (det indeholder <name>fornavn</name>. Her kan så ændres XmlElements indre tekst (her ændres den til "nyt navn")
Avatar billede smsng Nybegynder
12. august 2005 - 16:52 #11
Ahh...har set det..
Avatar billede anadan Nybegynder
12. august 2005 - 16:52 #12
XmlElement.name gives med som reference mellem de to Console.WriteLine
ChangeName(ref name);
Avatar billede smsng Nybegynder
12. august 2005 - 16:54 #13
Tak for hjælpen...skal lige have sat mig ind i det, da det er ca. 2200 linier kode jeg skal ændre, men det er vist ved at falde på plads hvordan det virker, så bare send et svar :-)
Avatar billede anadan Nybegynder
12. august 2005 - 16:57 #14
Det er ret nemt når man først kommer ind i det, og noget mere object orienteret end en simpel XmlTextWriter. Det er dog mere memory krævende, da man læser hele dokumentet ind, hvorefter man retter i det. XmlTextWriter er nok mest til at skrive, ikke at rette.
Avatar billede anadan Nybegynder
12. august 2005 - 17:00 #15
-og lige til sidst

doc.Save(...)
tager en XmlWriter/TextWriter/Stream/string:filename

eks : doc.Save("minXml.xml");
Avatar billede prec Nybegynder
15. august 2005 - 15:37 #16
Blot en kommentar til anadan:

Eftersom XmlElement er en class og ikke en struct er der ingen pointe i at overføre den som en ref.

Når en class overføres som parameter til en funktion vil den altid overføres som en reference til addressen i hukommelsen og vil dermed blive ændret direkte.

En struct kan overføres som parameter og frit ændres uden indflydelse på hvad der foregår andre steder. Af structs kan nævnes int, float, decimal osv.
Avatar billede anadan Nybegynder
15. august 2005 - 15:39 #17
hmm, takker :)
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