0

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

这是一个示例 XML: XML 数据

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

4

1 回答 1

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 接受<=响应。&lt;在我的搜索表达式中

这个更好看的代码片段:

 ...
 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
 ...

删除数独节点,但

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

投掷

msxml6.dll: Unexpected character in query string.
/addons/addon[@date -->&<--lt; "2012-08-31"]
于 2012-12-05T18:22:59.410 回答