2015-03-19 154 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