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


Anmelden zum Antworten