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

Update a node text using other node text as reference

你的

  1. 问题意味着两个节点,一个用于更改,一个用于更改 在;但我无法将其与您的规格联系起来 ('to another text')
  2. 示例 .xml 不是 well-formed (non-closed myrows)
  3. 代码使用虚假 () (.load, .save)
  4. 即使 .load 失败也尝试 .save 毫无意义

要查找要更改的节点,请使用 XPath 查找 xmldata,其中 myrow 的 id 为“11”。您可以调整该策略以找到要计算新标题的另一个节点。然后通过 parent 找到该节点的标题兄弟并更改 .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>

InStr() for "<id>11</id>" 将失败。您可以修改 RegExp,但这样就没有标题 'beyond that'。随意使用 Mid() 上的 InStrRev() 或 InStr() 做一些魔术。但是请显示少于 10 行的可靠工作代码。确保它正确处理最初为空的标题标签("<title/>""<title></title>")。

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

怎么办
<mycol><id>11</id><title/></mycol>

此示例使用 iso-8859-2 编码。 XML 的标准编码是 UTF-8。为此,您需要使用 ADODB.Stream 加载和保存文件的代码。尝试通过使用 .load 和 .save 来做到这一点 'more efficiently'。

将整个 XML 作为字符串读取。在字符串中搜索“11”。如果找到,则搜索“”,再搜索“”,替换字符串中的文本,然后将其用作新的 XML。有时不解析 XML.

会容易得多
  • 我看到您在搜索 (ASP/VBScript) 的解决方案。
  • 即使 (wscript/VBScript) 的解决方案看起来很相似,因为语言相同,您也需要进行一些更改才能使其工作。
  • 是的,它将与您在评论中写的那些联系一起使用。
  • 基于的想法,我写了一个完整的解决方案 ASP-Classic[=20] =](已经测试)。
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