XML File daten anfügen
-
Hallo zusammen ich habe zur Zeit folgendes Problem:
Ich erstell mir ein Config XML file per funktion.
Nun will ich beim erneuten aufruf ein neues Device hizufügen. Doch leider weiß ich nicht wie ich das machen soll ohne das neue File zu überscheiben.Hier der code:
if (File::Exists("Config.xml") == FALSE) { XmlDocument^ Config = gcnew XmlDocument; Config->LoadXml( "<Config></Config>" ); XmlNode^ root = Config->DocumentElement; // create Devices XmlElement^ DevNr = Config->CreateElement("Dev"); root->InsertAfter(DevNr, root->LastChild ); Config->Save( "Config.xml" ); } ELSE{XmlDocument^ Config = gcnew XmlDocument; Config->Load("Config.xml"); und nun ??
Wie kann ich nun beim Aufruf der funktion etwas anhängen?
Mit Xpath und insert befor / after hab ich es versucht aber leider bisher negativ.gruß und danke
Free
-
Benutze AppendChild(..)
Simon
-
Alos bisher hab ich das
if (File::Exists("Config.xml") == FALSE) { i=1; XmlDocument^ Config = gcnew XmlDocument; Config->LoadXml( "<Config></Config>" ); XmlNode^ root = Config->DocumentElement; // create Devices XmlElement^ DevNr = Config->CreateElement("Dev"); XmlElement^ name = Config->CreateElement("Name"); name->InnerText=DevName; DevNr->AppendChild(name); XmlElement^ prot = Config->CreateElement("Protkoll"); prot->InnerText=Protokoll; DevNr->AppendChild(prot); XmlElement^ adr = Config->CreateElement("PhyAdr"); adr->InnerText=PhyAdr.ToString(); DevNr->AppendChild(adr); XmlElement^ framef = Config->CreateElement("FrameFormat"); framef->InnerText=Frame.ToString(); DevNr->AppendChild(framef); XmlElement^ baud = Config->CreateElement("Baud"); baud->InnerText=baudrate.ToString(); DevNr->AppendChild(baud); root->InsertAfter(DevNr, root->LastChild ); Config->Save( "Config.xml" );
Da kommt folgendes raus
- <Config> - <Dev> <Name>Test</Name> <Protkoll>can</Protkoll> <PhyAdr>78</PhyAdr> <FrameFormat>29</FrameFormat> <Baud>19200</Baud> </Dev> </Config>
jetzt will ich ein neues dev anlegen das da z.b. dev2 heißt mit den selben attributen .
Nur wie bekomme ich bei aufrufen den XmlElement bezeichner entsprechend geändert?
-
jetzt will ich ein neues dev anlegen das da z.b. dev2 heißt mit den selben attributen .
Verstehe ich nicht. Zeige XML Output als Bsp.
Simon
-
hab doch den output oben gepostet
er ist wie folgt
- <Config> - <Dev> <Name>Test</Name> <Protkoll>can</Protkoll> <PhyAdr>78</PhyAdr> <FrameFormat>29</FrameFormat> <Baud>19200</Baud> </Dev> </Config>
neu soll er sein
- <Config> - <Dev> <Name>Test</Name> <Protkoll>can</Protkoll> <PhyAdr>78</PhyAdr> <FrameFormat>29</FrameFormat> <Baud>19200</Baud> </Dev> </Config> -<Dev2> <Name>Test2</Name> ..... <Baud>19200</Baud> </Dev2> </Config>
-
hat sich erledigt
Danke
-
Hallo nun will ich aus einem XML file Nodes löschen, die eine bestimmte eigenschaft haben.
Dazu folgender Code:XmlDocument ^ Routes = gcnew XmlDocument; Routes->Load(Filename); XmlElement^ ElementRoute = Routes->DocumentElement; XmlNodeList^ ListOfRoutes = ElementRoute->ChildNodes; for each ( XmlNode^ Node in ListOfRoutes) // go through XML list { if (comboBox1->Text == Node->FirstChild->NextSibling->InnerText) //Device number in Combobox == Device number in XML { ElementRoute->RemoveChild(Node); } } Routes->Save( "Routes.xml" ); }
Problem ist jetzt das die for each schleife nach dem löschen von einem Node abbricht, obwohl noch elemente mit der eigenschaft vorhanden sind.
Kann es sein das ich mit dem löschen eines Nodes die Liste unterbrech und damit die anderen elemente im nirvana stehen??
Gruß
-
Du kannst nicht gleichzeitig iterieren und löschen.
Eine Lösung wäre zuerst iterieren und die entsprechenden Nodes in einer Liste merken. Dann im zweiten Durchgang die gesammelten Nodes löschen.
Oder Du benutzt XPath und entfernst alle Nodes, die eine bestimmte Eingenschaft besitzen. Google doch mal nach XPath.
Simon