使用其他节点文本作为参考更新节点文本

时间:2015-01-02 22:10:24

标签: xml vbscript asp-classic

  • 我们需要更新<title>文本,其中<id>为11的文字。
  • 不知道行<myrow>在哪个位置。
  • 以下是此规则,我需要使用下面列出的其中一个连接,因为服务器仅支持这些:

    Set objXML = Server.CreateObject("Microsoft.XMLDOM")
    Set objXML = Server.CreateObject("MSXML2.FreeThreadedDOMDocument")
    Set objXML = Server.CreateObject("MSXML2.DOMDocument")
    Set objXML = Server.CreateObject("MSXML2.DOMDocument.3.0")
    Set objXML = Server.CreateObject("MSXML2.DOMDocument.6.0")
    
  • 这是XML:

    <?xml version="1.0" encoding="iso-8859-2" ?>
    <xmldata>
      <myrow>
        <id>10</id>
        <title>title1</title>
        <msg>Hello world!</msg>
      </myrow>
      <myrow>
        <id>11</id>
        <title>title2</title>
        <msg>Hello world!</msg>
      </myrow>
      <myrow>
        <id>12</id>
        <title>title3</title>
        <msg>Hello world!</msg>
      </myrow>
    </xmldata>
    
  • 这是我们目前的ASP VBScript代码:

    sub xmlUpdate(xpth)
      Set xmlObj = Server.CreateObject("Microsoft.XMLDOM")
      xmlObj.async = False
      xmlObj.setProperty "ServerHTTPRequest", True
      xmlObj.Load(xpth)
      If xmlObj.parseError.errorCode <> 0 Then
        Response.Write "Error Reading File - " & xmlObj.parseError.reason & "<p>"
      End If
      '---we need the rest of the code bellow-------------------------
    
      '---------------------------------------------------------------
      xmlObj.save(xpth)
    end sub
    

    注意:我已经有一个更新第一行的代码,但是当我们不知道该行的位置时,这个代码并不好。

3 个答案:

答案 0 :(得分:2)

  1. 问题意味着两个节点,一个要更改,一个基于更改 上;但我无法将其与您的规格相关联(&#39;与其他文字相关)
  2. 样本.xml格式不正确(非封闭式myrows)
  3. 代码使用spurious()(。load,.save)
  4. 尝试.save即使.load失败也没有意义
  5. 要查找要更改的节点,请使用XPath查找具有id为&#34; 11&#34;的myrow的xmldata。您可以调整该策略以查找要计算新标题的另一个节点。然后通过其父节点找到该节点的标题兄弟并更改.text。在代码中:

    Dim sXPath : sXPath   = "/xmldata/myrow/id[. = ""11""]"
    Dim nd11   : Set nd11 = xmlObj.selectSingleNode(sXPath)
    If nd11 Is Nothing Then
       WScript.Echo "failed:", sXPath
    Else
       Dim ndTitle : Set ndTitle = nd11.parentNode.selectSingleNode("title")
       WScript.Echo "found:", nd11.tagName, nd11.text, ndTitle.text
       ndTitle.text = "pipapo"
       WScript.Echo "changed:", nd11.parentNode.xml
    End If
    

    输出(简单脚本,而不是ASP):

    cscript 27749208.vbs
    found: id 11 title2
    changed: <myrow>
            <id>11</id>
            <title>pipapo</title>
            <msg>Hello world!</msg>
    </myrow>
    

    为效率爱好者提供思考的食物:

    一种方法是正确的,如果它可靠地给出正确的结果。一些正确的方法可能比其他方式更有效。不需要讨论在现实条件下失败的方式的效率。

    如果myrow元素看起来像

    ,上述策略将成功(没有任何更改)
    changed: <myrow>
            <title>pipapo</title>
            <id>
                        11
                    </id>
            <msg>Hello world!</msg>
    </myrow>
    

    "<id>11</id>"的InStr()将失败。你可能会修改一个RegExp,但之后就没有标题了#39;。随意在Mid()上使用InStrRev()或InStr()做一些魔术。但是请显示可靠的工作代码,少于10行。确保它最初正确处理空标题标记("<title/>""<title></title>")。

    如果文件的下一个版本包含

    ,该怎么办?
    <mycol><id>11</id><title/></mycol>
    

    此示例使用iso-8859-2编码。 XML的标准编码是UTF-8。为此,您需要使用ADODB.Stream加载和保存文件的代码。尝试更有效地做到这一点&#39;通过使用.load和.save。

答案 1 :(得分:0)

  • 我看到您搜索( ASP / VBScript )的解决方案。
  • 即使(wscript / VBScript)的解决方案看起来相似,因为语言是相同的,你需要做一些改动才能使它工作。
  • 并且是的,它将适用于您在评论中写的那些连接。
  • 根据@Ekkehard的想法,我用 ASP-Classic (已经过测试)编写了一个可行的完整解决方案
Call test(server.mappatch("/myfolder/myxmlfile.xml"))

sub test(xpth)
    dim xmlObj,sxPth,ndRef,ndTarget,mytext,myReference,myTarget
    myReference="11" : myTarget="title" : mytext="some text"

    Set xmlObj = Server.CreateObject("Microsoft.XMLDOM")
    xmlObj.async = False
    xmlObj.setProperty "ServerHTTPRequest", True
    xmlObj.Load(xpth)
    If xmlObj.parseError.errorCode <> 0 Then
        Response.Write "Error Reading File - " & xmlObj.parseError.reason & "<p>"
    End If

    sxPth   = "/xmldata/myrow/id[. = """&myReference&"""]"
    Set ndRef = xmlObj.selectSingleNode(sxPth)
    If ndRef Is Nothing Then
       response.write "Not found:"& " " &sxPth& "<br />"
    Else
       Set ndTarget = ndRef.parentNode.selectSingleNode(myTarget)
       response.write "found reference:["& " " &ndRef.tagName& "][" &ndRef.text& "] <br /> target:[" &ndTarget.text& "]"
       ndTarget.text = mytext
       response.write " changed to:[" & myText & "] <br />"
    End If

    xmlObj.save(xpth)
end sub

答案 2 :(得分:-1)

将整个XML作为字符串读取。在字符串中搜索“&lt; id&gt; 11&lt; / id&gt;”。如果找到,请搜索“&lt; title&gt;”除此之外,搜索“&lt; / title&gt;”除此之外,替换字符串中的文本,然后将其用作新的XML。有时,解析XML要容易得多。