2015-03-19 159 views
0

我希望跳過某些節點但無法弄清楚。我的目標是使用VBS文件中的XPath跳過某些節點

  • 遍歷KML文件,停止在第一個[SimpleData name =「POA_2006」]節點並將值寫入日誌。這一切都很好。
  • 跳進第一個[座標]節點並記錄所有座標。這很好。
  • 現在我想跳過可能在特定部分/郵編中的任何其他[座標]節點。這沒有發生。我該怎麼做呢?

這裏是我的KML文件的一個非常削減版本:

<?xml version="1.0" encoding="utf-8" ?> 
    <kml xmlns="http://www.opengis.net/kml/2.2"> 
    <Document id="root_doc"> 
    <Schema name="postcode" id="postcode"> 
     <SimpleField name="STATE_2006" type="string"></SimpleField> 
    <SimpleField name="POA_2006" type="string"></SimpleField> 
    </Schema> 
    <Folder><name>postcode</name> 
     <Placemark> 
     <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style> 
     <ExtendedData><SchemaData schemaUrl="#postcode"> 
      <SimpleData name="STATE_2006">1</SimpleData> 
      <SimpleData name="POA_2006">2000</SimpleData> 
     </SchemaData></ExtendedData> 
      <MultiGeometry><Polygon><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>relativeToGround</altitudeMode> 
      <coordinates>151.20118275199999,-33.873293252 151.201538016</coordinates></LinearRing></outerBoundaryIs></Polygon><Polygon><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>relativeToGround</altitudeMode> 
      <coordinates>151.225379008,-33.855265002 151.22524198400001</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry> 
     </Placemark> 
     <Placemark> 
     <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style> 
     <ExtendedData><SchemaData schemaUrl="#postcode"> 
      <SimpleData name="STATE_2006">1</SimpleData> 
      <SimpleData name="POA_2006">2006</SimpleData> 
     </SchemaData></ExtendedData> 
      <Polygon><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>relativeToGround</altitudeMode><coordinates>151.182640768,-33.891296046 151.18194374399997</coordinates></LinearRing></outerBoundaryIs></Polygon> 
     </Placemark> 
    </Folder> 
    </Document></kml> 

和她是VBS文件代碼:

function readKLMFileAndWriteToFile2(toFileName, fromFileName) 
     Dim fso, fPath ,xXML 
     Set fso = CreateObject("Scripting.FileSystemObject") 
     fPath = fso.GetAbsolutePathName(fromFileName) 
     Set xXML = CreateObject("Msxml2.DOMDocument") 
     xXML.SetProperty "SelectionNamespaces", "xmlns:base=""http://www.opengis.net/kml/2.2""" 
     xXML.setProperty "SelectionLanguage", "XPath" 
     xXML.async = False 
     xXML.load fPath 

     dim simpleData, coords, ctr 
     ctr = 0 
     For Each simpleData In xXML.selectNodes("//base:SimpleData[@name='POA_2006']") 
      writeLog simpleData.text 
      set coords = xXML.selectNodes("//base:coordinates") 
      writeLog coords(ctr).text 
      ctr = ctr + 1 
     Next 
    end function 

注意 - 該文件沒有錯誤以任何方式。問題是第一個郵政編碼(2000年)內第二個[座標]節點中的一組座標在其下一個郵政編碼(2006)的座標應填入其自身中。那麼如何跳過第二個[座標]節點?我在我現有的內部圖中對於每個SimpleData循環,我需要做一些棘手的事情,比如檢測在[postBlockaryIs]等兩個常見節點內有多少[座標]節點,我需要將這個數字添加到我的ctr變量。這個邏輯確實起作用,因爲我可以對它進行硬編碼並得到結果,但是Im有點卡住了。預先感謝您的幫助

更新 - 感謝您的意見。我從上面的示例KLM文件中刪除了不必要的座標,以便閱讀。根據這一變化,@MathiasMüller在此要求的是預期輸出(postCode,然後是第一個協調節點中的內容,然後跳轉到下一個郵政編碼,然後是這個新郵政編碼中第一個協調節點中的內容):

2000 
151.20118275199999,-33.873293252 151.201538016 
2006 
151.182640768,-33.891296046 151.18194374399997 

set coords = xXML.selectNodes(「// base:coordinates [1]」)的建議無效。

我也嘗試了建議的FOR循環。該代碼不喜歡(對象預期):

set coord = simpleData.selectSingleNode("./ancestor::base:ExtendedData/following-sibling::base:MultiGeometry//base:coordinates") 

回答

0

道歉回答我自己的問題。我認爲解決方案可能會在我的長篇文章中迷失。謝謝@ har07帶我到this page about XPath expresions。這是我的答案,但我也意識到在循環內引用我的文檔(xXML)並不好。我想知道是否有這樣的解決方案。在我最初的帖子中用for替換for循環:

For Each Placemark In xXML.selectNodes("//base:Placemark") 
     set simpleData = Placemark.selectNodes("//base:SimpleData[@name='POA_2006']") 
     writeLog simpleData(ctr).text 
     set coords = Placemark.selectNodes(".//base:coordinates") 
     writeLog coords(0).text 
     ctr = ctr + 1 
    Next 
0

這是不完全清楚你的要求,但如果

set coords = xXML.selectNodes("//base:coordinates") 

選擇所有base:coordinates元素,而不是隻在他們的第一個,使用

set coords = xXML.selectNodes("//base:coordinates[1]") 

如果還是不行,請明確顯示你所需要的輸出,而不是僅僅解釋它。

0

而不是使用索引,選擇使用XPath的<coordinates>節點相對於相應的<SimpleData>將更加可靠。例如:

For Each simpleData In xXML.selectNodes("//base:SimpleData[@name='POA_2006']") 
    writeLog simpleData.text 
    'select coord based on current simpleData :' 
    set coord = simpleData.selectSingleNode("./ancestor::base:ExtendedData/following-sibling::base:MultiGeometry//base:coordinates") 
    writeLog coord.text 
Next