none
Knoten ersetzen in XML RRS feed

  • Frage

  • Hallo,

    XML ist für mich noch immer ein Buch mit sieben Siegeln :( Die Beispiele im Netzt sind so vielfältig und letztendlich einfach nicht passend für mein Problem. Vielleicht kann mir hier jemand helfen.

    Ich habe 2 Xml-Dateien (defProp.xml und myDefProp.xml). Aus der defProp muss ich einige Werte auslesen und in der myDefProp ersetzen. Programmiere in Vb.Net 4.7 und VS 2017 CE. Mit XmlDocument hab ich es nicht hinbekommen. Soll ja auch mittlerweile obsolet sein. Also probierte ich es mit XDocument. Aber auch hier bekam ich immer nur Empty-Ergebnisse.

    Auszug aus den Dateien:


    defProp.xml

    <?xml version="1.0" encoding="utf-8"?>
    <CVariables xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Location>
        <X>81</X>
        <Y>83</Y>
      </Location>
      <Size>
        <Width>1118</Width>
        <Height>830</Height>
      </Size>


    myDefProp.xml

    <style>@namespace html url(http://www.w3.org/1999/xhtml); :root { font:small Verdana; font-weight: bold; padding: 2em; padding- } * { display: block; padding- } html|style { display: none; } html|span, html|a { display: inline; padding: 0; font-weight: normal; text-decoration: none; } html|span.block { display: block; } *[html|hidden], span.block[html|hidden] { display: none; } .expand { display: block; } .expand:before { content: '+'; color: red; } .collapse { display: block; } .collapse:before { content: '-'; color: red; } </style>

    <?xml version="1.0" encoding="utf-8"?>
    <CVariables xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

      <Location>
        <X>77</X>
        <Y>75</Y>
      </Location>
      <Size>
        <Width>1126</Width>
        <Height>834</Height>
      </Size>


    Ich möchte also die Werte aus der defProp auslesen und sie in die myDefProp schreiben. Ist hier nur beispielhaft ein kleiner Auszug. Wie greift man auf die Nodes und deren Inhalt zu?

    Viele Grüße Norbert



    <style>@namespace html url(http://www.w3.org/1999/xhtml); :root { font:small Verdana; font-weight: bold; padding: 2em; padding-left:4em; } * { display: block; padding-left: 2em; } html|style { display: none; } html|span, html|a { display: inline; padding: 0; font-weight: normal; text-decoration: none; } html|span.block { display: block; } *[html|hidden], span.block[html|hidden] { display: none; } .expand { display: block; } .expand:before { content: '+'; color: red; ; left: -1em; } .collapse { display: block; } .collapse:before { content: '-'; color: red; ; left:-1em; } </style>

    Freitag, 8. November 2019 13:23

Antworten

  • Hallo Norbert, 

    auf die Schnelle: 

        Sub TestXML()
    
            Dim xdoc As XElement = XElement.Load("C:\Temp\defProp.xml")
    
            Dim x = xdoc.Elements("Location").Elements("X").Value
            Dim y = xdoc.Elements("Location").Elements("Y").Value
            Dim w = xdoc.Elements("Size").Elements("Width").Value
            Dim h = xdoc.Elements("Size").Elements("Height").Value
    
        End Sub

    Funktioniert aber nicht bei der myDefProp.xml, weil das Style-Tag nicht unbedingt in eine XML Datei gehört.

    Wenn ich nachher noch mehr Zeit habe oder der Peter nicht schneller ist ;) schaue ich mir das noch weiter an...

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Freitag, 8. November 2019 15:49
  • Danke Stefan! Jetzt hats gefunkt. Der Abschnitt "style" ist nicht von mir. Hat sich beim Schreiben des Beitrages irgendwie reingeschmuggelt. Und ich wollte ihn nicht löschen.

    Hier (dank Deiner Hilfe!) der fertige Code (als Auszug):

            Dim docDef As XElement = XElement.Load("defProp.xml")
            Dim docMy As XElement = XElement.Load("myDefProp.xml")
            docMy.Element("Location").Element("X").Value = docDef.Element("Location").Element("X").Value
            docMy.Element("Location").Element("Y").Value = docDef.Element("Location").Element("Y").Value
            docMy.Element("Size").Element("Width").Value = docDef.Element("Size").Element("Width").Value
            docMy.Element("Size").Element("Height").Value = docDef.Element("Size").Element("Height").Value
    
            Dim xws As New XmlWriterSettings
            xws.OmitXmlDeclaration = True
            xws.Encoding = New System.Text.UTF8Encoding
            xws.Indent = True
            Dim xw As XmlWriter = XmlWriter.Create("myDefProp.xml", xws)
            docMy.Save(xw)
            xw.Close()

    Tolles Forum! Schönen Abend noch.

    Viele Grüße Norbert


    Freitag, 8. November 2019 16:22

Alle Antworten

  • Was ich schon probiert habe:

    Dim docDef As XDocument = XDocument.Load(Environment.CurrentDirectory & "\defProp.xml")

    docDef.<xsd:CVariables>      Ist Empty (<xmlns:xsd="http://www.w3.org/2001/XMLSchema"> ist importiert)

    From xel in docDef.<CVariables>.<Location>.<X> select xel Ich bekomme nicht den Wert "81"



    • Bearbeitet norbert3 Freitag, 8. November 2019 14:08
    Freitag, 8. November 2019 14:08
  • Hallo Norbert, 

    auf die Schnelle: 

        Sub TestXML()
    
            Dim xdoc As XElement = XElement.Load("C:\Temp\defProp.xml")
    
            Dim x = xdoc.Elements("Location").Elements("X").Value
            Dim y = xdoc.Elements("Location").Elements("Y").Value
            Dim w = xdoc.Elements("Size").Elements("Width").Value
            Dim h = xdoc.Elements("Size").Elements("Height").Value
    
        End Sub

    Funktioniert aber nicht bei der myDefProp.xml, weil das Style-Tag nicht unbedingt in eine XML Datei gehört.

    Wenn ich nachher noch mehr Zeit habe oder der Peter nicht schneller ist ;) schaue ich mir das noch weiter an...

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Freitag, 8. November 2019 15:49
  • Danke Stefan! Jetzt hats gefunkt. Der Abschnitt "style" ist nicht von mir. Hat sich beim Schreiben des Beitrages irgendwie reingeschmuggelt. Und ich wollte ihn nicht löschen.

    Hier (dank Deiner Hilfe!) der fertige Code (als Auszug):

            Dim docDef As XElement = XElement.Load("defProp.xml")
            Dim docMy As XElement = XElement.Load("myDefProp.xml")
            docMy.Element("Location").Element("X").Value = docDef.Element("Location").Element("X").Value
            docMy.Element("Location").Element("Y").Value = docDef.Element("Location").Element("Y").Value
            docMy.Element("Size").Element("Width").Value = docDef.Element("Size").Element("Width").Value
            docMy.Element("Size").Element("Height").Value = docDef.Element("Size").Element("Height").Value
    
            Dim xws As New XmlWriterSettings
            xws.OmitXmlDeclaration = True
            xws.Encoding = New System.Text.UTF8Encoding
            xws.Indent = True
            Dim xw As XmlWriter = XmlWriter.Create("myDefProp.xml", xws)
            docMy.Save(xw)
            xw.Close()

    Tolles Forum! Schönen Abend noch.

    Viele Grüße Norbert


    Freitag, 8. November 2019 16:22