Wert in XML-File ändern



  • Wie ändere ich einen Wert in einem XML-File?

    Nett wäre die ganze Soße - Öffnen, Element ausweählen, Wert setzen...

    ('Ne prinzipielle Beschreibung mit Klassennamen reicht schon, den Syntax bekomme ich hoffentlich noch zusammengebosselt)



  • Guck dir mal XmlDocument, XmlNode, XmlElement, ... an.

    Beispiel:

    XmlDocument doc;
    doc.Load(filename);
    XmlElement root = doc.DocumentElement;
    XmlNode node = root.SelectSingleNode(XPath-Ausdruck);
    //node bearbeiten.
    doc.Save();
    

    Nicht getestet, aus dem Kopf, daher bei der Anwendung bitte auch den Kopf verwenden 🙂



  • danke - habs schon gefunden (hatte woanders gefragt und keine Benachrichtigungen bekommen 🤡 )

    Für alle mit der gleichen Frage:

    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load( "myxml.xml" );
    
    XmlNode node = xmlDoc.SelectSingleNode( "/foo/bar/baz" );
    
    if ( node != null )
    {
    node.InnerText = "1";
    }
    
    xmlDoc.Save("myxml.xml");
    


  • siehe oben ^^



  • ups - deine Antwort war doch grad' noch kürzer?!



  • peterchen schrieb:

    ups - deine Antwort war doch grad' noch kürzer?!

    Hihi, ja 🙂 Habe sie direkt nochmal bearbeitet, weil ich den Quellcode aus dem Kopf aufschreiben konnte und heute mal nett sein wollte 😉



  • Hab' doch noch ein kleines (?) Problem: SelectSingleNode liefert null zurück.

    Mein XML-File sieht wie folgt aus:

    <?xml version="1.0" encoding="UTF-16" standalone="no"?>
    <Extensibility xmlns="http://schemas.microsoft.com/AutomationExtensibility">
    	<HostApplication>
    		<Name>Microsoft Visual Studio Macros</Name>
    		<Version>8.0</Version>
    	</HostApplication>
    	<HostApplication>
    		<Name>Microsoft Visual Studio</Name>
    		<Version>8.0</Version>
    	</HostApplication>
    	<Addin>
    		<FriendlyName>peterchens Linkify</FriendlyName>
    		<Description>Link source code comments to external documentation</Description>
    		<AboutBoxDetails>For more information, see the respective article at codeporject.com\r\n\r\nCopyright (c) 2006  Peter Hauptmann</AboutBoxDetails>
    		<AboutIconData>(blubber blubber)</AboutIconData>
    		<Assembly>D:\Sources\C#\Linkify\bin\Linkify.dll</Assembly>
    		<FullClassName>Linkify.Connect</FullClassName>
    		<LoadBehavior>1</LoadBehavior>
    		<CommandPreload>1</CommandPreload>
    		<CommandLineSafe>0</CommandLineSafe>
    	</Addin>
    </Extensibility>
    

    Ich will an "CommandPreload" und "LoadBehavior" ran.
    Das XmlDokument wird (laut Debugger) ordentlich geladen, aber mit

    XMlNode node = xmlDoc.SelectSingleNode("/Extensibility/Addin/CommandPreload");
    

    bekomme ich nur null zurück. 😕



  • Was passiert, wenn du nur "CommandPreload" an SelectSingleNode übergibst?
    Und was passiert, wenn du statt xmlDoc.SelectSingleNode das hier machst:
    xmlDoc.DocumentElement.SelectSingleNode



  • Sieht genauso aus.

    Ich hab' das UTF-16 durch UTF-8 ersetzt (und explizit als UTF-8 gespeichert),
    xmlDoc.SelectSingleNode("CommandPreload") == null, xmlDoc.DocumentElement.SelectSingleNode("CommandPreload") == null. 😞

    Habs! Nach ein bißchen rumspielen führt die falsche Exception zur richtigen Hilfe...

    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
    nsmgr.AddNamespace("ab", "http://schemas.microsoft.com/AutomationExtensibility");
    node = xmlDoc.SelectSingleNode("/ab:Extensibility/ab:Addin/ab:CommandPreload", nsmgr);
    

    Das ist aber ziemlich :wtf: Geht das nicht kürzer? 🙄

    P.S. Was für einen Sinn hat die UTF-x - Spezifikation? Um dorthinzukommen, muß der Parser das encoding ja schon richtig erkannt haben?!



  • Soweit ich weiß bezieht sich die UTF-X (kann übrigens auch ISO-XXXX sein)-Spezifikation nciht auf die gesamte Datei sondern nur auf die Values.

    Ob das bei deinem Beispiel kürzer geht kann ihc cniht sagen, aber es klingt ziemlich logisch, weil du ja einen Namespace verwendest und ein Tag eben nur durch namespace:tag eindeutig identifizierbar ist.



  • Man kann den namespace auch zum default namespace machen - dann ist es erträglich...

    nsmgr.AddNamespace(String.Empty, "http://schemas.microsoft.com/AutomationExtensibility");
    node = xmlDoc.SelectSingleNode("/Extensibility/Addin/CommandPreload", nsmgr);
    

    es klingt ziemlich logisch, weil du ja einen Namespace verwendest

    Ich will die Namespaces ja nicht, das war Microsoft 😃

    Danke für en Tip mit dem Namespace, der war's im Endeffekt!


Anmelden zum Antworten