xml - 使用其他节点文本作为引用更新节点文本

标签 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
    

    注意:我已经有一个更新第一行的代码,但是当我们不知道该行在哪里时就不好了。

最佳答案

你的

  1. 问题意味着两个节点,一个用于更改,一个用于更改 在;但我无法将其与您的规范联系起来(“与另一文本”)
  2. 示例 .xml 格式不正确(非封闭 myrows)
  3. 代码使用了虚假 ()(.load、.save)
  4. 即使 .load 失败也尝试 .save 没有任何意义

要查找要更改的节点,请使用 XPath 查找 myrow 的 id 为“11”的 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>

InStr() 为 "<id>11</id>"将失败。您可以修改正则表达式,但这样就不会出现“除此之外”的标题。请随意使用 Mid() 上的 InStrRev() 或 InStr() 施展一些魔法。但是请展示少于 10 行的可靠工作代码。确保它正确处理最初为空的标题标签( "<title/>""<title></title>" )。

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

<mycol><id>11</id><title/></mycol>

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

关于xml - 使用其他节点文本作为引用更新节点文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27749208/

相关文章:

javascript - 尝试使用链接延迟,但我尝试的任何代码都不起作用

mysql - ASP网站,MySQL数据库 "order by"结果

xml - delphi xmlchildnode 从父节点获取属性

php - 无需安装软件即可运行 PHP 脚本?

android - 使用 ProgressBar.setProgressDrawable 的问题

class - 有2个参数的Property Let有什么问题?

c# - Server.CreateObject + 服务器上下文 + COM :-)

javascript - jquery xml 存在

windows - 如何检查哪个操作系统?

javascript - 如何在 ASP/vbscript 中解析 XML?