Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在VBS文件中使用XPath跳过某些节点_Xml_Xpath_Vbscript_Kml - Fatal编程技术网

Xml 在VBS文件中使用XPath跳过某些节点

Xml 在VBS文件中使用XPath跳过某些节点,xml,xpath,vbscript,kml,Xml,Xpath,Vbscript,Kml,我想跳过某些节点,但想不通。我的目标是 遍历KML文件,在第一个[SimpleData name=“POA_2006”]节点停止,并将值写入日志。这一切都很好 跳转到第一个[coordinates]节点并记录所有坐标。这一切都很好 现在,我希望跳过可能位于特定区段/邮政编码中的任何其他[坐标]节点。这并没有发生。我该怎么做 以下是我的KML文件的精简版本: <?xml version="1.0" encoding="utf-8" ?> <kml xmlns="

我想跳过某些节点,但想不通。我的目标是

  • 遍历KML文件,在第一个[SimpleData name=“POA_2006”]节点停止,并将值写入日志。这一切都很好
  • 跳转到第一个[coordinates]节点并记录所有坐标。这一切都很好
  • 现在,我希望跳过可能位于特定区段/邮政编码中的任何其他[坐标]节点。这并没有发生。我该怎么做
以下是我的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>
注意-此文件没有任何错误。问题在于,第一个邮政编码(2000)内的第二个[coordinates]节点中的坐标集填充了其自身,其中坐标应为下一个邮政编码(2006)的坐标。那么我如何跳过第二个[坐标]节点呢?我认为在我现有的For each SimpleData循环中,我需要做一些棘手的事情,比如检测一些常见节点(如[Outerboundarys])中有多少[coordinates]节点,如果有两个类似于postcode 2000,我需要将这个数字添加到我的ctr变量中。这种逻辑确实有效,因为我可以硬编码并得到结果,但我有点被动态地执行它所束缚。提前谢谢你的帮助

更新-感谢您的输入。我已经从上面的示例KLM文件中删除了不必要的坐标,以便更容易阅读。基于此更改,根据@Mathias Müller的请求,此处是预期输出(邮政编码,然后是第一个协调节点中的内容,然后跳转到下一个邮政编码,然后是此新邮政编码中第一个协调节点中的内容):

set coords=xXML.selectNodes(“//base:coordinates[1]”)的建议无效

我还尝试了建议的FOR循环。代码不喜欢(应为对象):


现在还不清楚你在问什么,但是如果

set coords = xXML.selectNodes("//base:coordinates")
选择所有
base:coordinates
元素,而不是仅选择其中的第一个元素,请使用

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

如果这不起作用,请显式地显示您需要的输出,而不是仅仅解释它。

使用XPath相对于相应的
选择
节点将更可靠,而不是使用索引。例如:

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

很抱歉回答了我自己的问题。我认为解决方案可能会在我的长篇大论中迷失。谢谢@har07带领我来到这里。这就是我的答案所在,但我也意识到在循环中引用我的文档(xXML)是不好的。我想知道这样的解决方案是否可行。在我的第一篇文章中,将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 
set coords = xXML.selectNodes("//base:coordinates[1]")
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
  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