Avatar billede cogitans Nybegynder
19. juli 2004 - 15:01 Der er 36 kommentarer og
1 løsning

Indsætte data ind i Xml

Hvordan sætter man noget ny data ind i slutnngen på et Xml-dokument? Den måde, jeg har fundet ud af indtil videre, sletter hele dokumentet, så man faktisk skal skrive dokumentet igen helt fra begyndelsen af.
Her er min kode:
private void Button1_Click(object sender, System.EventArgs e)
        {
            string tid=String.Format(DateTime.Now.Day + DateTime.Now.Month + "Kl" + DateTime.Now.Hour + DateTime.Now.Minute);
            XmlTextWriter writer=new XmlTextWriter("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml", System.Text.Encoding.UTF8);
            writer.Formatting = Formatting.Indented;
            writer.WriteStartDocument();
            writer.
            //System.Diagnostics.Debug.Write("tid: "+tid+ " tekst et: "+ TextBox1.Text);
            writer.WriteElementString(tid, TextBox1.Text);// XmlConvert.ToString(TextBox1.Text)
            writer.Close();
        }

?
Avatar billede arne_v Ekspert
19. juli 2004 - 15:12 #1
Du læser et DOM træ ind med f.eks.:

XmlDocument doc = new XmlDocument();
doc.Load("C:\\etellerandet.xml");

Du tilføjer så et nyt element til DOM træet med f.eks.:

XmlNode add = doc.CreateElement("elementnavn");
add.AppendChild(doc.CreateTextNode("Element tekst"));
doc.DocumentElement.AppendChild(add);
       
Og så gemmer du med f.eks.:

doc.Save("C:\\nogetandet.xml");
Avatar billede cogitans Nybegynder
19. juli 2004 - 15:14 #2
Så jeg skal helt glemme den kode, som jeg har lavet indtil nu?
Avatar billede Syska Mester
19. juli 2004 - 15:17 #3
Der skulle være meget bedre understøttelse af XML i php5, bare lige som en reminder..
Avatar billede arne_v Ekspert
19. juli 2004 - 15:26 #4
Hvis du vil tilføje til et XML dokument, så tror jeg at DOM træet er meget bedre
end XmlTextWriter'en.
Avatar billede cogitans Nybegynder
19. juli 2004 - 15:30 #5
Ja, det ser også klart nemmere ud kodemæssigt.
Men nu har jege jo så skrevet det:

        private void Button1_Click(object sender, System.EventArgs e)
        {
            string tid=String.Format(DateTime.Now.Day + DateTime.Now.Month + "Kl" + DateTime.Now.Hour + DateTime.Now.Minute);
            XmlDocument doc = new XmlDocument();
            doc.Load("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml");
            XmlNode add = doc.CreateElement(tid);
            add.AppendChild(doc.CreateTextNode(TextBox1.Text));
            doc.DocumentElement.AppendChild(add);
            doc.Save("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml");
        }

og når jeg kører det, så skriver den:
"
Tegnet '2', hexadecimal værdi 0x32, kan ikke begynde med et navn. Linje 2, position 2.
Beskrivelse: Der opstod en ikke-afviklet undtagelse under udførelse af den aktuelle webanmodning. Se staksporingen for at få yderligere oplysninger om fejlen, og hvor den kom fra i koden.
Detaljer om undtagelse: System.Xml.XmlException: Tegnet '2', hexadecimal værdi 0x32, kan ikke begynde med et navn. Linje 2, position 2.
Kildefejl:
Linje 80:             writer.Close();*/
Linje 81:             XmlDocument doc = new XmlDocument();
Linje 82:             doc.Load("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml");
Linje 83:             XmlNode add = doc.CreateElement(tid);
Linje 84:             add.AppendChild(doc.CreateTextNode(TextBox1.Text));
"

Hvad betyder det så?
Avatar billede arne_v Ekspert
19. juli 2004 - 15:35 #6
Det ser ud som at den ikke kan lide at tag navnet starter med et tal !?
Avatar billede cogitans Nybegynder
19. juli 2004 - 15:40 #7
Ja, men det er da mærkeligt, når XmlTextWriter'en ikke havde noget imod det. Nå, men for at komme om ved det problem, kunne man sætte klientnavnet ind forest i strengen. Men ved du, hvordan man kan få klientnavnet med gennem et button-click?
Avatar billede arne_v Ekspert
19. juli 2004 - 15:49 #8
Du kunne vel også bare teste med et "e" og se om det så virker.

Jeg har ingen anelse om hvordan du fisker klient navnet.
Avatar billede cogitans Nybegynder
19. juli 2004 - 15:50 #9
Hmm...jeg har lige forsøgt med linien:
XmlNode add = doc.CreateElement("tid "+tid);
men fejlen kommer stadig. Er der noget generelt forkert med min opbygnng af koden da?
Avatar billede cogitans Nybegynder
19. juli 2004 - 15:53 #10
Jeg har lige prøvet med en streng kun - men den brokker sig stadig. Men den linie i fejlmeddelelsen, som er farvet rød, er:
"doc.Load("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml");"
så mon ikke det er syntaxen, den er gal med, og ikke det, som jeg prøver at sætte ind i selve xmldokumentet?
Avatar billede arne_v Ekspert
19. juli 2004 - 15:55 #11
Har du også rettet i de gamle entries i XML filen (som læses ind ved Load) ?
Avatar billede cogitans Nybegynder
19. juli 2004 - 15:56 #12
Xml-filen ser således ud:

<?xml version="1.0" encoding="utf-8"?>
<26Kl1450>abc</26Kl1450>
Avatar billede arne_v Ekspert
19. juli 2004 - 15:59 #13
Prøv at ret den til:

<?xml version="1.0" encoding="utf-8"?>
<alle>
  <tid26Kl1450>abc</26Kl1450>
</alle>
Avatar billede arne_v Ekspert
19. juli 2004 - 15:59 #14
<?xml version="1.0" encoding="utf-8"?>
<alle>
  <tid26Kl1450>abc</tid26Kl1450>
</alle>
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:00 #15
Ja, den skal jo også have et rodelement...
Avatar billede tomjelen Nybegynder
19. juli 2004 - 16:00 #16
lille udklip fra http://www.w3schools.com som nok kan hjælpe dig lidt:

Element Naming

XML elements must follow these naming rules:

    * Names can contain letters, numbers, and other characters
    * Names must not start with a number or punctuation character
    * Names must not start with the letters xml (or XML or Xml ..)
    * Names cannot contain spaces

Take care when you "invent" element names and follow these simple rules:

Any name can be used, no words are reserved, but the idea is to make names descriptive. Names with an underscore separator are nice.

Examples: <first_name>, <last_name>.

Avoid "-" and "." in names. For example, if you name something "first-name," it could be a mess if your software tries to subtract name from first. Or if you name something "first.name," your software may think that "name" is a property of the object "first."

Element names can be as long as you like, but don't exaggerate. Names should be short and simple, like this: <book_title> not like this: <the_title_of_the_book>.

XML documents often have a corresponding database, in which fields exist corresponding to elements in the XML document. A good practice is to use the naming rules of your database for the elements in the XML documents.

Non-English letters like éòá are perfectly legal in XML element names, but watch out for problems if your software vendor doesn't support them.

The ":" should not be used in element names because it is reserved to be used for something called namespaces (more later).
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:04 #17
Men fejlen kommer altså stadigvæk: "doc.Load("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml");"
???
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:06 #18
Jeg brugte den samme sti, da jeg benyttede XmlTextWriter, så stien er sat rigtig sammen. Er det XmlTextWriter, som kræver en specel syntax?
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:10 #19
XmlFilen ser sådan ud:
<?xml version="1.0" encoding="utf-8"?>
<besked>
  <26Kl1450>abc</26Kl1450>
</besked>

Jeg prøvede at rette
doc.Load("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml");
i koden til
doc.LoadXml("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml");
og nu giver den en anden fejl:

Detaljer om undtagelse: System.Xml.XmlException: Dataene på rodniveau er ugyldige. Linje 1, position 1.

Kildefejl:


Linje 80:             writer.Close();*/
Linje 81:             XmlDocument doc = new XmlDocument();
Linje 82:             doc.LoadXml("C:\\Inetpub\\wwwroot\\New\\GuestBook.xml");
Linje 83:             XmlNode add = doc.CreateElement("tid");
Linje 84:             add.AppendChild(doc.CreateTextNode(TextBox1.Text));

Giveer denne fejl mere mening?
Avatar billede tomjelen Nybegynder
19. juli 2004 - 16:10 #20
Den skriver fejl ved den linie hvis der er fejl i indholdet af xml filen, f.eks. hvis du har et element der starter med et nummer som navn. Ved ikke om du så at Arne også tilføjet "tid" i starten af dit tids-element.
Avatar billede tomjelen Nybegynder
19. juli 2004 - 16:12 #21
så ikke din besked ovenover før jeg postede. Men dit element <26Kl1450>abc</26Kl1450> har forkert navn, det kan ikke starte med et tal.
Avatar billede arne_v Ekspert
19. juli 2004 - 16:12 #22
Load og tid forrest i element navn.
Avatar billede arne_v Ekspert
19. juli 2004 - 16:13 #23
Hvis jeg husker rigtigt forsøger LoadXml at loade en XML streng og ikke en fil med XML !
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:14 #24
Jeg slettede elementet <26k...> og får nu fejlen:
Detaljer om undtagelse: System.Xml.XmlException: Dataene på rodniveau er ugyldige. Linje 1, position 1.
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:16 #25
ahh...nu vil den.
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:23 #26
Det skal kun være Load. Og grunden til fejlen var sikkert, at der allerede var nogle elementer ine i Xmldokumentet, som ikke var gyldige (begyndte med tal).
Men jeg vil gerne have den aktuelle tid ind også. Kan jeg ikke på den ind som attribut i <tid>? Og hvordan gør jeg så det?
Avatar billede arne_v Ekspert
19. juli 2004 - 16:37 #27
Prøv:

add.Attributes.Append(doc.CreateAttribute("attrname", "attrvalue"));
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:44 #28
Ja, et virker da...selvom det ikke ser for kønt ud:
<tid d2p1:tid="" xmlns:d2p1="19_7_Kl_16_43">q</tid>
Hvorfor kommer "d2p1:" og "" xmlns:d2p1="" med?
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:48 #29
Kan man også benytte XmlDocument doc = new XmlDocument() til at læse fra en XmlFil?
Avatar billede arne_v Ekspert
19. juli 2004 - 16:49 #30
Jeg mener at man skal læse den med Load.
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:51 #31
Okay - det vil jeg lige lege lidt med så. Men du vidste ikke, om strukturen skulle være som den er i 19/07-2004 16:44:37?
Avatar billede arne_v Ekspert
19. juli 2004 - 16:51 #32
Prøv med:

XmlAttribute attr = doc.CreateAttribute("attrname");
attr.Value = "attrvalue";
add.Attributes.Append(attr);
Avatar billede arne_v Ekspert
19. juli 2004 - 16:52 #33
Det skal den heller ikke.

Prøv med mit nye forslag.
Avatar billede cogitans Nybegynder
19. juli 2004 - 16:56 #34
Så fungerer det...men jeg kunne nu godt tænke mig, at få klientnavnet med in i xmlfilen. Men det var ikke muligt?
Avatar billede arne_v Ekspert
19. juli 2004 - 17:06 #35
Ingen anelse.

Jeg kender jo slet ikke konteksten.
Avatar billede arne_v Ekspert
19. juli 2004 - 17:06 #36
Og et svar
Avatar billede cogitans Nybegynder
19. juli 2004 - 17:14 #37
Okay...men tak for hjælpen!
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