Nik: XML mit Hilfe von VBScript auslesen

Hallo zusammen,

in meiner Not, versuche ich es nun mal hier bei euch. Vielleicht könnt ihr mir ja helfen.

Ich kämpfe mit der folgenden Struktur:

<?xml version="1.0" encoding="iso-8859-1" ?>
<dataList xmlns="DataNameSpace" >
  <numSection>
    <num name="Dicke" public="true" privilege="0" >
      <valueNum index="0" value="1.66509" />
      <valueNum index="1" value="1.684622" />
      <valueNum index="2" value="1.474655" />
      <valueNum index="3" value="1.586963" />
      <valueNum index="4" value="1.657766" />
      <valueNum index="5" value="1.726127" />
    </num>
    <num name="Rest" public="true" privilege="0" >
      <valueNum index="0" value="0.019717" />
      <valueNum index="1" value="-0.004803" />
      <valueNum index="2" value="0.019335" />
      <valueNum index="3" value="0.012168" />
      <valueNum index="4" value="0.012168" />
      <valueNum index="5" value="0.036681" />
    </num>
</dataList>

Ich muss mit VBScript die verschiedenen Values von "Dicke" und "Rest" auslesen. Ich glaube, dass mein Problem darin liegt, dass ich den richtigen Pfad an die entsprechenden Stellen nicht rausfinde, um die Werte anzusprechen. Wer kann mir bitte weiterhelfen??

Danke
Nik

  1. Hallo,

    in meiner Not, versuche ich es nun mal hier bei euch. Vielleicht könnt ihr mir ja helfen.

    Ich kämpfe mit der folgenden Struktur:

    <?xml version="1.0" encoding="iso-8859-1" ?>
    <dataList xmlns="DataNameSpace" >
      <numSection>
        <num name="Dicke" public="true" privilege="0" >
          <valueNum index="0" value="1.66509" />

    ...

    </num>
        <num name="Rest" public="true" privilege="0" >
          <valueNum index="0" value="0.019717" />

    ...

    </num>
    </dataList>

    Ich muss mit VBScript die verschiedenen Values von "Dicke" und "Rest" auslesen. Ich glaube, dass mein Problem darin liegt, dass ich den richtigen Pfad an die entsprechenden Stellen nicht rausfinde, um die Werte anzusprechen. Wer kann mir bitte weiterhelfen??

    Was hast du denn bisher versucht?
    Beschäftige dich mit der setProperty Methode (setProperty "SelectionLanguage", "XPath") und mit der selectNodes Methode: (selectNodes("dataList/numSection/num[@name='Dicke'/valueNum")

    Lade dir das MSXML heruntern http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=3144B72B-B4F2-46DA-B4B6-C5D7485F2B42
    darin findest du auch viele VBScript beispiele.

    Grüße
    Thomas
    )

    1. Hallo Thomas,

      danke für deine schnelle Antwort. Offensichtlich kann er jetzt den richtigen Knoten ansprechen, aber so ganz geht's noch nicht. Das komische ist auch, dass er als Länge dieser Node-List nur eine 0 hat.

      Ich hab's auf folgende zwei Wege versucht:
      1:
      -----------------
      sFilePath = "D:\lib_export.dtx"
      sXPath = "dataList/numSection/num[@name='Dicke']/valueNum"

      Set oXMLDoc = CreateObject("MSXML2.DOMDocument")
      oXMLDoc.async = False
      oXMLDoc.resolveExternals = False
      oXMLDoc.load sFilePath
      oXMLDoc.setProperty "SelectionLanguage", "XPath"

      Set dApps = CreateObject("Scripting.Dictionary")
      dApps.CompareMode = vbTextCompare
      Set oApps = oXMLDoc.documentElement.selectNodes(sXPath)

      For Each oApp In oApps
          dApps.Add oApp.getAttribute("index"), oApp.getAttribute("value")
          ' Ausgabe ....
      Next
      --------------

      2.
      ----------------------
      Set objNodeList = oXMLDoc.documentElement.selectNodes(sXPath)

      For i = 1 To (objNodeList.length - 1)
          Set objNode = objNodeList.nextNode
          ' Ausgabe ....
      Next
      -----------------

      Es ist so, dass ich das in einer WinCC-Umgebung programmieren muss, wo eben die verschiedenen Skripte aufgerufen werden. Aber leider funktioniert das noch nicht so ganz. Wo liegt mein Fehler??

      Grüße
      Nik

      1. Hallo,

        danke für deine schnelle Antwort. Offensichtlich kann er jetzt den richtigen Knoten ansprechen, aber so ganz geht's noch nicht. Das komische ist auch, dass er als Länge dieser Node-List nur eine 0 hat.

        Ich hab's auf folgende zwei Wege versucht:
        1:

        sXPath = "dataList/numSection/num[@name='Dicke']/valueNum"

        Set oApps = oXMLDoc.documentElement.selectNodes(sXPath)

        Was ist das documentElement wirklich in deinem Fall?
        Ist es bereits "dataList", dann sucht der XPath in dataList/dataList/numSection/...
        Passen den XPath-Pfad genau auf dein XML an oder benutze sXPath = "//dataList/numSection/num[@name='Dicke']/valueNum" oder kürzer dann: sXPath = "//num[@name='Dicke']/valueNum"

        Eventuell spielt noch der Namesraum eine Rolle, aber probier erstmal die XPath-angaben aus. (dass ein </numSection> in deinem Beispiel-XML fehlt ist ein Copy&Past Fehler, oder?)

        Grüße
        Thomas

        1. Hallo Thomas,

          sorry, hat ein wenig länger gedauert....

          Ich hab nun alle möglichen XPath-Angaben ausprobiert, aber es geht immer noch nicht. Die Länge des Nodes ist immer noch 0.

          ....
          <numSection>
              <num name="nSkinThickness" public="true" privilege="0" >
                <valueNum index="0" value="1.66509" />
                ....
              .....
              </num>
           </numSection>
          ....
          Dass hinter der Dicke auch noch public="true" privilege="0" stehen, ist dabei wirklich belanglos?

          Eventuell spielt noch der Namesraum eine Rolle, aber probier
          erstmal die XPath-angaben aus. ...

          Was meinst du denn mit "Namesraum"? Was gibt's da noch zu beachten?

          Ja, das fehlende </numSection> war ein Copy&Paste-Fehler.

          Bin schon fast am Verzweifeln...!

          Grüße und schonmal danke!
          Nik

          1. Hallo,

            ....
            Dass hinter der Dicke auch noch public="true" privilege="0" stehen, ist dabei wirklich belanglos?

            Ja.

            Eventuell spielt noch der Namesraum eine Rolle, aber probier
            erstmal die XPath-angaben aus. ...
            Was meinst du denn mit "Namesraum"? Was gibt's da noch zu beachten?

            du hast in dem ersten Beispiel dass du angeben hast ein: "<dataList xmlns="DataNameSpace">" stehen.
            Das "xmlns="DataNameSpace" soll dabei ein Namensraumangaben sein. Sie ist aber falsch (auch wenn der URI eines Namensraumes nicht auf ein real existierende Quelle verweisen muss).
            Es sollte z.B. so etwas sein xmlns="http://example.org/DataNameSpace" .

            Wenn das zu irgrendwelchen Testzwecken im XML steht, entferne das. Wenn das XML generiert wird und dies so drinn steht, muss du dafür sorgen, dass es deinem Script bekannt ist.

            Schau dir dazu die getDeclaredPrefixes Methode oder die namespaces Eigenschaft an.

            Bin schon fast am Verzweifeln...!

            Dazu besteht kein Grund. Ich kann dir nur nochmal raten, dass du dir die Beispiele in der MSXML-SDK anschaust und versuchst erstmal mit ein paar von denen einige Test zu machen.

            Grüße
            Thomas

            1. Hallo Thomas,

              vielen Dank für deine Hilfe. Jetzt hab ich's endlich geschafft, das Zeug auszulesen, musste zwar noch eine bisschen rumprobieren, aber jetzt klappt's!

              Ich musste nicht den Umweg über die declared prefixes gehen, sondern habe es folgendermaßen machen können:

              sFilePath = "D:\lib_export.dtx"
              sXPath= "//num[@name=Dicke]/valueNum"
              Set oXMLDoc_Haut = CreateObject("MSXML2.DOMDocument")
              oXMLDoc.async = False
              oXMLDoc.resolveExternals = False
              oXMLDoc.load sFilePath
              'und jetzt kommt der große Unterschied;
              'ich hab statt "SelectionLanguage" "SelectionNamespaces" eingefügt und statt "XPath" meinen Namensraum "xmlns='DataNameSpace'"
              oXMLDoc_Haut.setProperty "SelectionNamespaces", "xmlns='DataNameSpace'"

              Und dann halt weiter wie zuvor...

              Nochmals vielen lieben Dank. Hätte es ohne dich nicht geschafft!!

              Viele Grüße
              Nik

              1. Hallo Nik,

                Nochmals vielen lieben Dank. Hätte es ohne dich nicht geschafft!!

                Gern geschehen! ;-)

                Grüße
                Thomas