使用vbscript有条件地从XML中删除节点

时间:2012-12-05 17:06:21

标签: xml vbscript

我有一个xml文件,用于将数据解析为HTML文件。我正在使用vbscript来做到这一点。在解析数据之前,我需要有条件地删除文件中的一些节点。我在HTML表单上有一个日期,我需要用它来比较XML文件中的日期。如果日期超出范围,那么我想删除节点及其下的任何子节点。

以下是XML示例: XML Data

在上面的示例中,如果任何子节点的“exp”值小于表单上的日期,则应将其删除。如果它下面有一个子节点,那么它也应该被删除。因此,如果我的表单上的日期是12/5/12,那么我的第一个“O”节点应该与其下的子节点一起删除。所有节点都有一个日期,所以我必须查看每个节点。该文件可以与此一样小或具有许多其他节点。谁能帮助我指出正确的方向?同样,这需要使用vbscript完成。

1 个答案:

答案 0 :(得分:1)

使用XPath查找“有趣”节点,使用.removeChild来删除它们:

  Dim oFS    : Set oFS  = CreateObject("Scripting.FileSystemObject")
  Dim sFSpec : sFSpec   = oFS.GetAbsolutePathName("..\data\01.xml")
  Dim oXML   : Set oXML = CreateObject("Msxml2.DOMDocument.6.0")
  Dim sDate  : sDate    = "2012-08-31"
  oXML.setProperty "SelectionLanguage", "XPath"
  oXML.async = False
  oXML.load sFSpec
  If 0 = oXML.parseError Then
     WScript.Echo oXML.xml
     WScript.Echo "-----------------"
     Dim sXPath : sXPath     = "/addons/addon[@date=""" & sDate & """]"
     Dim ndlFnd : Set ndlFnd = oXML.selectNodes(sXPath)
     If 0 = ndlFnd.length Then
        WScript.Echo sXPath, "not found"
     Else
        WScript.Echo "found", ndlFnd.length, "nodes for", sXPath
        Dim ndCur
        For Each ndCur In ndlFnd
            ndCur.parentNode.removeChild ndCur
        Next
     End If
     WScript.Echo "-----------------"
     WScript.Echo oXML.xml
  Else
     WScript.Echo oXML.parseError.reason
  End If

输出:

======================================================================
<?xml version="1.0"?>
<addons>
        <addon id="TicTacToe" date="2012-11-05">
                <requires>
                        <import addon="xbmc.python" version="1.0"/>
                </requires>
        </addon>
        <addon id="Sudoku" date="2012-08-31">
                <requires>
                        <import addon="xbmc.python" version="1.0"/>
                </requires>
        </addon>
        <addon id="Doom" date="1953-04-13">
                <requires>
                        <import addon="xbmc.python" version="1.0"/>
                </requires>
        </addon>
        <addon id="Muehle" date="2012-10-18">
                <requires>
                        <import addon="xbmc.python" version="1.0"/>
                </requires>
        </addon>
</addons>

-----------------
found 4 nodes for /addons/addon
filtering for dtX <= 31.08.2012
-----------------
<?xml version="1.0"?>
<addons>
        <addon id="TicTacToe" date="2012-11-05">
                <requires>
                        <import addon="xbmc.python" version="1.0"/>
                </requires>
        </addon>
        <addon id="Muehle" date="2012-10-18">
                <requires>
                        <import addon="xbmc.python" version="1.0"/>
                </requires>
        </addon>
</addons>

======================================================================

手动过滤很糟糕,但

  1. 它将为您的非常实用的日期格式提供便利
  2. 我无法让XPath接受<= resp。我的搜索表达式中的&lt;
  3. 这个更好看的代码片段:

     ...
     Dim sXPath : sXPath     = "/addons/addon[@date=""" & sDate & """]"
     Dim ndlFnd : Set ndlFnd = oXML.selectNodes(sXPath)
     If 0 = ndlFnd.length Then
        WScript.Echo sXPath, "not found"
     Else
        WScript.Echo "found", ndlFnd.length, "nodes for", sXPath
        Dim ndCur
        For Each ndCur In ndlFnd
            ndCur.parentNode.removeChild ndCur
        Next
     End If
     ...
    

    删除Sudoku节点,但

    ...
    Dim sXPath : sXPath     = "/addons/addon[@date &lt; """ & sDate & """]"
    ...
    

    引发

    msxml6.dll: Unexpected character in query string.
    /addons/addon[@date -->&<--lt; "2012-08-31"]