<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
注意:我已经有一个更新第一行的代码,但是当我们不知道该行的位置时,这个代码并不好。
答案 0 :(得分:2)
您
要查找要更改的节点,请使用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)
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要容易得多。