Avatar billede the_raze Nybegynder
18. marts 2008 - 18:22 Der er 17 kommentarer og
1 løsning

Tilføj til eksisterende xml

Hejsa,

Jeg har følgende eksisterende xml:
<NewDataSet>
  <Fields>
    <Control>TextBox</Control>
    <Data>String</Data>
    <Required>Yes</Required>
    <Order>1</Order>
    <Label>Navn</Label>
    <Id>Navn</Id>
    <Text />
  </Fields>
  <Fields>
    <Control>Multiline</Control>
    <Data>Other</Data>
    <Required>Yes</Required>
    <Order>2</Order>
    <Label>Adresse</Label>
    <Id>Adresse</Id>
    <Text />
  </Fields>
</NewDataSet>

Ud fra ovenstående xml, er det da muligt at gøre det sådan, at jeg  ændrer <Text /> under den <Fields> node hvor Id = Adresse? F.eks til <Text>Skibevej 11</Text>

Eller er jeg NØDT TIl at have min xml på følgende form:

<NewDataSet>
  <Fields id="Navn">
    <Control>TextBox</Control>
    <Data>String</Data>
    <Required>Yes</Required>
    <Order>1</Order>
    <Label>Navn</Label>
    <Id>Navn</Id>
    <Text />
  </Fields>
  <Fields id="adresse">
    <Control>Multiline</Control>
    <Data>Other</Data>
    <Required>Yes</Required>
    <Order>2</Order>
    <Label>Adresse</Label>
    <Id>Adresse</Id>
    <Text />
  </Fields>
</NewDataSet>

På forhånd tak - ser helst at jeg kan gøre det første. Men mangler lige input til hvordan.
Avatar billede arne_v Ekspert
18. marts 2008 - 18:29 #1
Du boer kunne XPath addresere dig ogsaa med den originale variant.

Utestet:

//NewDataSet/Fields[Id='Adresse']/Text/text()
Avatar billede the_raze Nybegynder
18. marts 2008 - 18:33 #2
Nu har jeg heller ik testet den endnu, men Fields[Id='Adresse'], den går rent faktisk også ind og kigger på childNodes i <Fields> noden?
Avatar billede arne_v Ekspert
18. marts 2008 - 18:41 #3
Ja.
Avatar billede arne_v Ekspert
18. marts 2008 - 18:41 #4
(jeg antager at du kender doc.SelectSingleNode etc.)
Avatar billede the_raze Nybegynder
18. marts 2008 - 19:18 #5
Det gør jeg ja! :) Ved ikke hvorfor jeg havde fået opfattelsen at Fields[Id='Adresse'] KUN kiggede på evt. attributter i Fields-noden.

Vil nemlig gerne have den til at løbe følgende igennem:

<NewDataSet>
  <Results>
    <Navn>Jesper</Navn>
    <Adresse>hehe</Adresse>
  </Results>
</NewDataSet>

og så tage id'en fra <Navn> (navn) og indsætte i den fields-node hvor Id = navn i det xml jeg har nævnt herover. Og ligeledes gøre det samme med adresse - nemlig at indsætte "hehe" i den fields-node hvor Id = adresse.

Dette burde kunne lade sig gøre? :)
Avatar billede arne_v Ekspert
18. marts 2008 - 19:28 #6
[xxx='foobar'] er element xxx - [@xxx='foobar'] er attribut xxx

----

det sidste skal jeg lige tygge paa
Avatar billede the_raze Nybegynder
18. marts 2008 - 19:32 #7
ah cool! Uanset hvad, burde jeg nok bede dig om at smide et svar :) Så flytter jeg det andet over i et nyt topic.. Endnu engang er du redningsmanden arne_v - tak :)
Avatar billede kalp Novice
18. marts 2008 - 19:37 #8
hvis jeg har forstået opgaven..
kopire data fra et databaset over i et andet?
og i innerText på Text for både Navn og Adresse?

//den du kopirer fra - starter med navn.
XmlDocument document = new XmlDocument();
document.LoadXml("<dinXmlHer/>");
XmlNode name = document.SelectSingleNode("NewDataSet/Results/Navn");

den du kopirer til.

XmlDocument workingDocument = new XmlDocument();
workingDocument.LoadXml("<xml her/>");

XmlNode fields = workingDocument.SelectSingleNode("NewDataSet/Fields[Id = 'Navn']);
fields.SelectSingleNode('./Text').InnerText = name.InnerText;
Avatar billede kalp Novice
18. marts 2008 - 19:37 #9
databaset = DataSet Xml :)
Avatar billede the_raze Nybegynder
18. marts 2008 - 19:46 #10
Kalp, det ser jo umiddelbart rigtigt ud - lad mig lige prøve det af :) og så opretter jeg et nyt spørgsmål, som du bare svarer på, er det ik måden at gøre det på?
Avatar billede kalp Novice
18. marts 2008 - 19:57 #11
jeg behøver ikke point..
du kan give arne_v point her og så du lige tjekke koden af om den virker.. hvis ikke så skal den nok justeres meget lidt, men det kan vi finde ud af;)
Avatar billede the_raze Nybegynder
18. marts 2008 - 20:57 #12
Faktisk kalp.. Det er ikke hvergang jeg har navn og adresse - nogle gange hedder tingene noget andet, og nogle gange er der flere fields noder end bare 2.. Det er ligeledes heller ik hvergang at der er input til hver enkelt osv.

Ved ikke om der er en måde til nemt at tage højde for dette? Så den bare kigger alle nodesne igennem i mit input xml og så indsætter hvor der er en forekomst i mit første xml? Ved ik om du ved hva jeg mener - men dette ska jeg self nok give dig point for, for det er litd mere besværligt :)

Endnu engang tak!
Avatar billede kalp Novice
18. marts 2008 - 21:14 #13
laver lige et eksempel.. ellers bliver det for rodet;)
Avatar billede kalp Novice
18. marts 2008 - 21:44 #14
hvis jeg forstod dig korrekt, så skal resultatet være det her?

<NewDataSet>
  <Fields>
    <Control>TextBox</Control>
    <Data>String</Data>
    <Required>Yes</Required>
    <Order>1</Order>
    <Label>Navn</Label>
    <Id>Navn</Id>
    <Text>Jesper</Text>
  </Fields>
  <Fields>
        <Control>Multiline</Control>
        <Data>Other</Data>
        <Required>Yes</Required>
        <Order>2</Order>
        <Label>Adresse</Label>
        <Id>Adresse</Id>
        <Text>hehe</Text>
</Fields>
</NewDataSet>


det gør den kode her i hvertfald.

using System;
using System.Text;
using System.Xml;
using System.Collections.Generic;

namespace XmlArt
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument dataExtract = new XmlDocument();
            dataExtract.LoadXml("<NewDataSet>"+
                                    "<Results>"+
                                        "<Navn>Jesper</Navn>"+
                                        "<Adresse>hehe</Adresse>"+
                                    "</Results>"+
                                "</NewDataSet>");
            XmlNode result = dataExtract.SelectSingleNode("NewDataSet/Results");
            List<DataElement> elements = new List<DataElement>();
            foreach (XmlNode node in result.ChildNodes){
                DataElement element = new DataElement();
                element.Name  = node.Name;
                element.Value = node.InnerText;
                elements.Add(element);
            }

            XmlDocument resultDocument = new XmlDocument();
            resultDocument.LoadXml("<NewDataSet>"+
                                      "<Fields>"+
                                        "<Control>TextBox</Control>"+
                                        "<Data>String</Data>"+
                                        "<Required>Yes</Required>"+
                                        "<Order>1</Order>"+
                                        "<Label>Navn</Label>"+
                                        "<Id>Navn</Id>"+
                                        "<Text />"+
                                      "</Fields>"+
                                      "<Fields>"+
                                        "<Control>Multiline</Control>"+
                                        "<Data>Other</Data>"+
                                        "<Required>Yes</Required>"+
                                        "<Order>2</Order>"+
                                        "<Label>Adresse</Label>"+
                                        "<Id>Adresse</Id>"+
                                        "<Text />"+
                                      "</Fields>"+
                                    "</NewDataSet>");

            foreach (DataElement element in elements) {
                XmlNode currentNode = resultDocument.SelectSingleNode("NewDataSet/Fields[Id = '"+element.Name+"']");
                currentNode.SelectSingleNode("./Text").InnerText = element.Value;
            }
        }
        private class DataElement{
            public string Name;
            public string Value;
        }
    }
}
Avatar billede arne_v Ekspert
19. marts 2008 - 04:03 #15
Kalps eksempel er ganske glimrende.

Det kunne implementeres anderledes:

using System;
using System.Collections.Generic;
using System.Xml;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            string addxml = @"<NewDataSet>
  <Results>
    <Navn>Jesper</Navn>
    <Adresse>hehe</Adresse>
  </Results>
</NewDataSet>";
            XmlDocument adddoc = new XmlDocument();
            adddoc.LoadXml(addxml);
            Dictionary<string, string> repl = new Dictionary<string, string>();
            foreach(XmlElement elm in adddoc.SelectSingleNode("//NewDataSet/Results").ChildNodes)
            {
                repl.Add(elm.Name, elm.FirstChild.Value);
            }
                   
            string basexml = @"<NewDataSet>
  <Fields>
    <Control>TextBox</Control>
    <Data>String</Data>
    <Required>Yes</Required>
    <Order>1</Order>
    <Label>Navn</Label>
    <Id>Navn</Id>
    <Text />
  </Fields>
  <Fields>
    <Control>Multiline</Control>
    <Data>Other</Data>
    <Required>Yes</Required>
    <Order>2</Order>
    <Label>Adresse</Label>
    <Id>Adresse</Id>
    <Text />
  </Fields>
</NewDataSet>";
            XmlDocument basedoc = new XmlDocument();
            basedoc.LoadXml(basexml);
            foreach(XmlElement fields in basedoc.SelectNodes("//NewDataSet/Fields"))
            {
                string id = fields.SelectSingleNode("Id").FirstChild.Value;
                fields.SelectSingleNode("Text").AppendChild(basedoc.CreateTextNode(repl[id]));
            }
            basedoc.Save(Console.Out);
            Console.ReadKey();
        }
    }
}

men det er vist mest et spørgsmål om smag og behag.
Avatar billede arne_v Ekspert
19. marts 2008 - 04:04 #16
og et svar
Avatar billede the_raze Nybegynder
20. marts 2008 - 13:02 #17
Begge svar fungerer upåklageligt - og tuuusind tak for det!!

Kalp, hvordan gør vi med point afregning til dig? Opretter jeg bare et nyt spørgsmål eller hvordan?
Avatar billede kalp Novice
20. marts 2008 - 13:10 #18
vi springer blot point delen over denne gang og siger god påske;)
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