Avatar billede pjen2004 Nybegynder
01. januar 2009 - 20:23 Der er 3 kommentarer og
1 løsning

selectNodes virker ikke på XML-fil, namespace?

Jeg benytter følgende kode til at læse en XML-fil:

Private Sub Form_Load()



  Dim objDoc As MSXML2.DOMDocument40
  Dim objNodeList As MSXML2.IXMLDOMNodeList
  Dim objNode As MSXML2.IXMLDOMNode
       
  Set objDoc = New MSXML2.DOMDocument40
 

  If objDoc.Load("C:\VB\WFS1\Node_test\wfs.xml") Then
    If Not objDoc Is Nothing Then
      Set objNodeList = objDoc.selectNodes("wfs_FeatureCollection/gml_featureMember/pdk_akt_lokalplan_v/pdk_planid")
           
      If Not objNodeList Is Nothing Then
        'Loop though each node in the node list
        For Each objNode In objNodeList
          MsgBox objNode.Text
        Next
      End If
   
    End If
  End If
 

End
 
End Sub


XML-filen er indsat herunder. Mit problemer er følgende:

1) Jeg kan ikke få "selectNodes" til at virke, medmindre jer erstatter ":" med et andet tegn - f.eks. "_". Jeg kan ikke umiddelbart rette i filen, der hentes fra en webserver.

2) Første node har en lang beskrivelse efter sig "wfs_FeatureCollection......" - det bevirker at jeg heller ikke kan få "selectNodes" til at virke her - medmindre jer barbarer denne ned til kun at hedder ""wfs_FeatureCollection".

Jeg håber en har nogle gode ideer til en løsning ! :-)

(Jeg har ladet mig fortælle at der skal oprettes et "namespace" - men hvordan gør man det i VB6 ?)



<?xml version="1.0" encoding="ISO-8859-1"?>
<wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:pdk="http://wfs.plansystem.dk" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://wfs.plansystem.dk:80/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd http://wfs.plansystem.dk http://wfs.plansystem.dk:80/geoserver/wfs/DescribeFeatureType?typeName=pdk:akt_lokalplan_v">
  <gml:boundedBy>
    <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#25832">
      <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">579000.9375,6229998.5 579484.375,6230462</gml:coordinates>
    </gml:Box>
  </gml:boundedBy>
  <gml:featureMember>
    <pdk:akt_lokalplan_v fid="akt_lokalplan_v.110430">
      <pdk:planid>1086996</pdk:planid>
      <pdk:plantype>20.2</pdk:plantype>
      <pdk:plantypebesk>Byplanvedtægter</pdk:plantypebesk>
      <pdk:plannr>H-E_5</pdk:plannr>
      <pdk:plannavn>Kontor, handel og lagervirksomhed øst for Grenåvej ved Muslingevej, Dalsager og Solklintevej.</pdk:plannavn>
      <pdk:komnr>751</pdk:komnr>
      <pdk:komnavn>Århus</pdk:komnavn>
      <pdk:geometri>
        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#25832">
          <gml:polygonMember>
            <gml:Polygon>
              <gml:outerBoundaryIs>
                <gml:LinearRing>
                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">579233.116,6230311.514 579291.053,6230270.584 579294.242,6230268.331 579303.266,6230261.921 579300.381,6230256.389 579296.881,6230251.054 579295.054,6230248.014 579278.595,6230223.201 579270.717,6230212.639 579255.834,6230193.4 579247.073,6230183.514 579226.275,6230162.368 579216.71,6230153.32 579202.236,6230141.167 579201.279,6230139.464 579201.112,6230138.951 579200.678,6230137.607 579200.456,6230135.666 579200.519,6230134.935 579200.623,6230133.719 579200.858,6230132.922 579201.174,6230131.845 579202.084,6230130.117 579203.775,6230128.071 579205.663,6230126.207 579199.648,6230119.86 579178.097,6230105.141 579175.254,6230103.196 579159.193,6230092.116 579142.818,6230080.887 579126.129,6230069.443 579109.827,6230058.263 579093.172,6230046.842 579076.953,6230035.719 579060.309,6230024.306 579043.896,6230013.05 579030.354,6230003.764 579028.935,6229998.792 579021.048,6230011.025 579000.972,6230042.236 579007.642,6230045.147 579034.517,6230067.679 579054.568,6230085.78 579073.983,6230102.837 579095.229,6230122.064 579119.05,6230147.186 579127.218,6230155.721 579134.834,6230164.019 579148.782,6230180.411 579158.55,6230193.987 579167.811,6230207.124 579177.435,6230221.258 579186.579,6230234.988 579193.655,6230245.787 579205.15,6230263.431 579211.931,6230273.875 579212.901,6230275.364 579217.39,6230281.56 579225.887,6230297.009 579233.116,6230311.514</gml:coordinates>
                </gml:LinearRing>
              </gml:outerBoundaryIs>
            </gml:Polygon>
          </gml:polygonMember>
        </gml:MultiPolygon>
      </pdk:geometri>
    </pdk:akt_lokalplan_v>
  </gml:featureMember>
  <gml:featureMember>
    <pdk:akt_lokalplan_v fid="akt_lokalplan_v.110434">
      <pdk:planid>1087000</pdk:planid>
      <pdk:plantype>20.1</pdk:plantype>
      <pdk:plantypebesk>Lokalplaner</pdk:plantypebesk>
      <pdk:plannr>86</pdk:plannr>
      <pdk:plannavn>Centerområde ved Egå Havvej</pdk:plannavn>
      <pdk:komnr>751</pdk:komnr>
      <pdk:komnavn>Århus</pdk:komnavn>
      <pdk:geometri>
        <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#25832">
          <gml:polygonMember>
            <gml:Polygon>
              <gml:outerBoundaryIs>
                <gml:LinearRing>
                  <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" ">579484.365,6230380.556 579474.253,6230377.479 579455.322,6230339.783 579431.003,6230292.203 579397.309,6230223.287 579379.092,6230236.026 579316.161,6230280.039 579301.106,6230291.757 579291.053,6230270.583 579233.116,6230311.513 579244.145,6230331.917 579254.469,6230350.215 579258.087,6230355.715 579272.712,6230378.839 579292.128,6230420.763 579302.556,6230439.216 579304.226,6230438.181 579303.692,6230430.2 579309.289,6230427.675 579328.382,6230461.766 579350.361,6230454.009 579360.423,6230450.536 579370.366,6230446.736 579380.179,6230442.613 579389.852,6230438.17 579399.373,6230433.412 579408.734,6230428.345 579417.923,6230422.975 579422.676,6230420.072 579425.053,6230418.62 579432.068,6230414.085 579433.417,6230413.122 579458.145,6230397.315 579484.365,6230380.556</gml:coordinates>
                </gml:LinearRing>
              </gml:outerBoundaryIs>
            </gml:Polygon>
          </gml:polygonMember>
        </gml:MultiPolygon>
      </pdk:geometri>
    </pdk:akt_lokalplan_v>
  </gml:featureMember>
</wfs:FeatureCollection>
Avatar billede arne_v Ekspert
01. januar 2009 - 21:32 #1
Som jeg læser docs så skal man bruge:

objDoc.setProperty("SelectionNamespaces", "xmlns:wfs='http://www.opengis.net/wfs' xmlns:gml='http://www.opengis.net/gml' xmlns:pdk='http://wfs.plansystem.dk'")

og:

objDoc.SelectNodes("//wfs:FeatureCollection/gml:featureMember/pdk:akt_lokalplan_v/pdk:planid")

men jeg må indrømme - det virker ikke hos mig !
Avatar billede pjen2004 Nybegynder
01. januar 2009 - 21:49 #2
Hmmm - det gør det heller ikke her...

(Har også kigget mig lidt omkring vedr. namespaces... kan ikke umiddelbart finde en løsning...). Træls at noget så simpelt kan drille så meget... ;)
Avatar billede pjen2004 Nybegynder
02. januar 2009 - 20:02 #3
Hvis jeg bruger denne kode, kan jeg godt læse min XML-fil, selvom der ikke benyttes namespace-definition???

Men jeg kan ikke lige gennemskue hvordan jeg får den omstruktureret til at tage fat i en bestemt node og få fat i dens værdi, som jeg kan vil??? Kan nogen hjælpe?


Option Explicit

Private Sub Form_Load()
    Dim sFile As String
    sFile = App.Path
    If Right(sFile, 1) <> "\" Then sFile = sFile & "\"
    sFile = sFile & "wfs_ORG.xml"
    XMLOnTreeView TreeView1, sFile
End Sub

Public Function XMLOnTreeView(tv As Object, _
  XMLFile As String) As Boolean

'PURPOSE:  Display Contents on an XML File hierarchically within
'a treeview control

'PARAMETERS:
'tv: TreeView Control to use
'XMLFile: Full Path of a valid XML file.

'RETURNS: True if sucessful, false otherwise

'REQUIRES: VB6 and MSXML.DLL Version 2.0
'which is installed automatically with
'IE 5



Dim oDoc As New DOMDocument



If Not LCase(TypeName(tv)) = "treeview" Then Exit Function
tv.Nodes.Clear

If Dir(XMLFile) = "" Then Exit Function
    If oDoc.Load(XMLFile) Then
        XMLNodes2TVNodes tv, oDoc.childNodes, 0
  End If
ErrorHandler:
    Set oDoc = Nothing


End Function

Private Sub XMLNodes2TVNodes(tv As TreeView, ByRef Nodes As MSXML.IXMLDOMNodeList, _
    ByVal Indent As Integer, Optional ParentKey As Variant)

    Dim oNode As MSXML.IXMLDOMNode
    Dim lKey As Long
    Dim sKey As String
   
    Indent = Indent + 2

    For Each oNode In Nodes
        If LCase(oNode.nodeName <> "xml") Then
       
      If oNode.hasChildNodes = False Then

       
          If oNode.nodeType = NODE_TEXT Or oNode.nodeType = NODE_CDATA_SECTION Then
                tv.Nodes.Add CStr(ParentKey), tvwChild, , oNode.nodeValue
            End If
           
           
         
        Else
            On Error Resume Next
            If IsMissing(ParentKey) Then
                sKey = oNode.nodeName
                tv.Nodes.Add , , sKey, sKey
            Else
                Do
                On Error Resume Next
                sKey = oNode.nodeName & CStr(lKey)
                tv.Nodes.Add CStr(ParentKey), tvwChild, sKey, oNode.nodeName
                If Err.Number <> 0 Then
                    Err.Clear
                    lKey = lKey + 1
                Else
                    Exit Do
                End If
                Loop
            End If
             
           
        End If

        If oNode.hasChildNodes Then
            XMLNodes2TVNodes tv, oNode.childNodes, Indent, sKey
        End If
    End If
    Next oNode
End Sub
Avatar billede pjen2004 Nybegynder
02. januar 2009 - 22:19 #4
Jeg fandt en løsning på mit problem! Hvis jeg bruger "Dim objDoc As New DOMDocument" i stedet for "Dim objDoc As New MSXML2.DOMDocument40" i toppen kan filen læses uden problemer og uden at bøvle med namespaces. Jeg ved ikke hvorfor det virker... men det skal man sikkert ikke tænke så meget på...



Private Sub Form_Load()

  Dim objDoc As New DOMDocument
  Dim objNodeList As MSXML2.IXMLDOMNodeList
  Dim objNode As MSXML2.IXMLDOMNode

     
  If objDoc.Load("C:\VB\WFS1\Node_test\wfs_ORG.xml") Then
    If Not objDoc Is Nothing Then
       
        Set objNodeList = objDoc.selectNodes("//wfs:FeatureCollection/gml:featureMember/pdk:akt_lokalplan_v/pdk:planid")
        If Not objNodeList Is Nothing Then
        'Loop through each node in the node list
            For Each objNode In objNodeList
                MsgBox objNode.Text
            Next
        Else
        End If
   
    Else
    End If
 
  Else
      MsgBox "Fejl ved læsning af XML-dokument!"
  End If
 

End
 
End Sub
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester