- 我们需要更新
<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
注意:我已经有一个更新第一行的代码,但是当我们不知道该行在哪里时就不好了。
最佳答案
你的
- 问题意味着两个节点,一个用于更改,一个用于更改 在;但我无法将其与您的规范联系起来(“与另一文本”)
- 示例 .xml 格式不正确(非封闭 myrows)
- 代码使用了虚假 ()(.load、.save)
- 即使 .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/