使用VBS访问KML文件中的特定命名节点

时间:2015-03-17 05:05:01

标签: xml vbscript asp-classic kml

我正在提取一个邮政编码并从KML文件中进行协调(以构建一个巨大的Javascript数组)但是我无法在名为“POA_2006”的节点中定位该值,我在.vbs文件中运行它。我可以使用.singleNode或.namedItem来执行此操作,通常使用XML文件,但无法使用看起来像这样的KML文件(我无法控制KML文件。它是一个包含所有的大量180mb文件协调澳大利亚所有邮政编码的形状):

<?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 ,-33.851193004 151.19797801600001</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>
  </Placemark>
</Folder>
</Document></kml>

这是我被迫使用的代码,但是我不喜欢这样做的事实'if(i mod 1.5)= 1然后'总是忽略第一个节点以确保它跳过到包含我的邮政编码的第二个节点

    function readKLMFileAndWriteToFile(toFileName, fromFileName)
        Dim objxml, fso, filetxt, getname, path 
        Set objxml = CreateObject("MSXML2.DOMDocument")
        objxml.async = False
        objxml.load (fromFileName)
        Set fso = CreateObject("Scripting.FileSystemObject") 
        Set filetxt = fso.CreateTextFile(toFileName, True) 
        path = fso.GetAbsolutePathName(toFileName) 
        getname = fso.GetFileName(path) 
        writeLog "A file called " & getname & " was created"    

        Dim SimpleData, SimpleDataLen, coords,coordsLen,i, ctr, i2
        set SimpleData = objxml.getElementsByTagName("SimpleData")
        SimpleDataLen  = SimpleData.length-1
        set coords     = objxml.getElementsByTagName("coordinates")
        coordsLen      = coords.length-1
        ctr = 0
        for i = 0 to SimpleDataLen
              'filetxt.write i & " mod = " & i mod 1.5 & "]" & vbcrlf
              'why can I not target the named 'POA_2006' node! Use this workaround to only show every second SimpleData node 
              if (i mod 1.5) = 1 then
                  filetxt.write "var postcode_" & SimpleData.item(i).Text & " = ["
                  filetxt.write replace(coords.item(ctr).Text, " ", ",") & "];" & vbcrlf 
                  ctr = ctr+1
              end if
        next
        filetxt.Close 
    end function

我是如何直接定位节点的?

1 个答案:

答案 0 :(得分:1)

您可以通过XPath选择查询来定位它。首先,选择选择语言

' put this in before .load()
objxml.SetProperty "SelectionLanguage", "XPath"

然后,您可能还需要将命名空间添加到XML文档的SelectionNamespaces属性中:

objxml.SetProperty "SelectionNamespaces", "xmlns:k=""http://www.opengis.net/kml/2.2"""

你需要给它起名字 - 我在这里用k。现在您可以直接查询有问题的节点:

set SimpleData = objxml.SelectSingleNode("//k:SimpleData[@name='POA_2006']")

SelectSingleNode()方法返回单个对象而不是集合,因此您可以使用SimpleData.text访问节点的上下文。

filetxt.write "var postcode_" & SimpleData.Text & " = ["