检测节点的存在,然后使用属性和文本

时间:2015-08-06 07:28:02

标签: xml xpath vbscript asp-classic kml

除了打印节点的文本值之外,我的代码中的所有内容都有效。这是我的KML文件:

<?xml version="1.0" encoding="utf-8" ?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document id="root_doc">
<Schema name="AUS_POSTCODE_POLYGON_2015_05" id="AUS_POSTCODE_POLYGON_2015_05">
</Schema>
<Folder><name>AUS_POSTCODE_POLYGON_2015_05</name>
  <Placemark>
  <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
  <ExtendedData><SchemaData schemaUrl="#AUS_POSTCODE_POLYGON_2015_05">
    <SimpleData name="DT_CREATE">20150423</SimpleData>
    <SimpleData name="POSTCODE">5700</SimpleData>
    <SimpleData name="STATE_PID">4</SimpleData>
    <SimpleData name="STATE">SA</SimpleData>
  </SchemaData></ExtendedData>
    <MultiGeometry><Polygon><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>relativeToGround</altitudeMode>
    <coordinates>137.745052224211719,-32.403930130629746 </coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>
  </Placemark>
  <Placemark>
  <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
  <ExtendedData><SchemaData schemaUrl="#AUS_POSTCODE_POLYGON_2015_05">
    <SimpleData name="DT_CREATE">20150423</SimpleData>
  </SchemaData></ExtendedData>
    <MultiGeometry><Polygon><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>relativeToGround</altitudeMode>
    <coordinates>139.971166832040183,-32.421544630638806</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>
  </Placemark>
  <Placemark>
  <Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
  <ExtendedData><SchemaData schemaUrl="#AUS_POSTCODE_POLYGON_2015_05">
    <SimpleData name="DT_CREATE">20141021</SimpleData>
    <SimpleData name="POSTCODE">5022</SimpleData>
    <SimpleData name="STATE_PID">4</SimpleData>
    <SimpleData name="STATE">SA</SimpleData>
  </SchemaData></ExtendedData>
    <MultiGeometry><Polygon><altitudeMode>relativeToGround</altitudeMode><outerBoundaryIs><LinearRing><altitudeMode>relativeToGround</altitudeMode>
    <coordinates>138.485436120358145,-34.875330494997144</coordinates></LinearRing></outerBoundaryIs></Polygon></MultiGeometry>
  </Placemark>
</Folder>
</Document></kml>

这是我的VBScript:

Dim fso, fPath , i, xpath, placemark, simpleDataNode, stateID, postCode
dim objxml
Set fso  = CreateObject("Scripting.FileSystemObject")
fPath    = fso.GetAbsolutePathName(fromFileName)
Set objxml = CreateObject("Msxml2.DOMDocument")
objxml.SetProperty "SelectionNamespaces", "xmlns:base=""http://www.opengis.net/kml/2.2"""
objXML.async =  False
objXML.Load fPath

If 0 = objXML.ParseError Then
  xpath     = "//base:Placemark"
  Set placemark  = objXML.selectNodes(xpath)
  writeLog  placemark.length & " = how many nodes found"
  If 0 < placemark.length Then
    For Each simpleDataNode In placemark 
      Set stateID  = simpleDataNode.selectSingleNode("ExtendedData/SchemaData/SimpleData[@name='STATE_PID']")
      Set postCode = simpleDataNode.selectSingleNode("ExtendedData/SchemaData/SimpleData[@name='POSTCODE']")
      If Not stateID Is Nothing Then
        writeLog stateID.getAttribute("name")
        'writeLog stateID.item(0).Text     < gives me error
      else
        writeLog "no state node found "
      end if
      If Not postCode Is Nothing Then
        writeLog postCode.getAttribute("name")
        'writeLog postCode.item(0).Text    < gives me error
      else
        writeLog "no postCode node node found "
      end if
    Next
  Else
    writeLog "not found |" & xpath & "|"
  End If
Else
  writeLog objXML.ParseError.Reason
End If

代码遍历每个Placemark节点并检测到:

  • 是否有一个带有STATE_PID值的SimpleData节点?如果是,则打印名称和节点文本
  • 是否有一个带有POSTCODE值的SimpleData节点?如果是,则打印名称和节点文本

这两个问题的这一行有效:

writeLog stateID.getAttribute("name")

但这一行没有:

writeLog stateID.item(0).Text     < gives me error

它给我一个对象不支持这个属性或方法。如何打印节点文本值?

在浏览此Placemark节点时,我还想在坐标节点中打印地标文本。

这是输出。正如您所看到的,它正确告诉我第二个Placemark节点缺少状态和邮政编码节点:

3 = how many nodes found
STATE_PID
POSTCODE
no state node found 
no postCode node node found   
STATE_PID
POSTCODE

1 个答案:

答案 0 :(得分:2)

stateIDpostCode是简单(文本)节点,而不是集合。因此,请使用stateID.textpostCode.text