将XML节点值替换为另一个经典ASP,VB脚本

时间:2012-06-21 12:48:18

标签: xml asp-classic vbscript

我有以下需要使用ASP VBscript解析的XML,

<ERROR>
    <ITEM>
        <CODE>X11</CODE> 
        <TEXT>E112</TEXT>
    </ITEM>
    <ITEM>
        <CODE>X14</CODE> 
        <TEXT>E888</TEXT> 
    </ITEM>
    <OTHER-INFO>
        <XID>I989</XID>  
    <OTHER-INFO>    
<ERROR>

我的要求是将ITEM内的TEXT值替换为相应的详细信息,我将从getInfo(代码)函数中获取它。如何使用经典的asp和vbscript替换TEXT值。

需要输出,

<ITEM>
    <CODE>X11</CODE> 
        <TEXT>Detailed Explanation about this error</CODE>
</ITEM>

我编写了以下代码来迭代每个ITEM。 objMSXML包含上面的标签,我需要将结果放回同一个对象中。

If objMSXML.getElementsByTagName("ERROR").length <> 0 Then
    For Each ObjNode In objMSXML.documentElement.selectNodes("ITEM")
        strTrasMsg = getInfo(objECGO.xVal("CODE",ObjNode,"STR"))


    Next
End If 

3 个答案:

答案 0 :(得分:1)

您可以尝试使用xpath选择节点并替换文本

类似的东西,我没有尝试过,但它应该可以工作,因为支持xpath

   Set Node = xmlDoc.selectsinglenode("//ERROR/ITEM[../CODE/text()="item code vlaue"/text)

   Node.text = "NEW VALUE"

   xmldoc.save

或者另一种方法是通过编写标记来重新创建响应,因为您已经填充了代码和描述,如。

var myxml = "<ITEM><CODE>"your value"</CODE><TEXT>"your value"</CODE></ITEM>

比保存这个xml。

答案 1 :(得分:0)

尝试以下方法(假设每个ITEM都存在TEXT元素)。

For Each oItem In objMSXML.documentElement.selectNodes("ITEM") 
    oItem.selectSingleNode("TEXT").text = getInfo(objECGO.xVal("CODE", oItem ,"STR"))  
Next 

答案 2 :(得分:0)

简短回答:

For Each ObjNode In objMSXML.documentElement.selectNodes("ITEM")
    strTrasMsg = "whatever-" & ObjNode.firstChild.text ' getInfo(objECGO.xVal("CODE",ObjNode,"STR"))
    WScript.Echo strTrasMsg, ObjNode.childNodes(1).text
    ObjNode.childNodes(1).text = strTrasMsg
Next

即:使用DOM树并通过索引访问子节点。

答案很长:

如果你(全部)根据这个骨架提出你的“编辑我的xml”问题:

  Dim sXml : sXml = Join(Array(_
       "<ERROR>" _
    ,  "    <ITEM>" _
    ,  "        <CODE>X11</CODE>" _
    ,  "        <TEXT>E112</TEXT>" _
    ,  "    </ITEM>" _
    ,  "    <ITEM>" _
    ,  "        <CODE>X14</CODE>" _
    ,  "        <TEXT>E888</TEXT>" _
    ,  "    </ITEM>" _
    ,  "    <OTHER-INFO>" _
    ,  "        <XID>I989</XID>" _
    ,  "    </OTHER-INFO>" _
    ,  "</ERROR>" _
  ))
  Dim objMSXML : Set objMSXML = CreateObject("Msxml2.DOMDocument")

  objMSXML.setProperty "SelectionLanguage", "XPath"
  objMSXML.async = False
  objMSXML.loadXml sXml

  If 0 = objMSXML.parseError Then
     If objMSXML.getElementsByTagName("ERROR").length <> 0 Then
        Dim ObjNode, strTrasMsg
        For Each ObjNode In objMSXML.documentElement.selectNodes("ITEM")
            strTrasMsg = "whatever-" & ObjNode.firstChild.text '             
            ---- problem -----
        Next
        WScript.Echo objMSXML.xml
     End If
  Else
     WScript.Echo objMSXML.parseError.reason
  End If

输出:

whatever-X11 E112
whatever-X14 E888
<ERROR>
        <ITEM>
                <CODE>X11</CODE>
                <TEXT>whatever-X11</TEXT>
        </ITEM>
        <ITEM>
                <CODE>X14</CODE>
                <TEXT>whatever-X14</TEXT>
        </ITEM>
        <OTHER-INFO>
                <XID>I989</XID>
        </OTHER-INFO>
</ERROR>
在发布之前,可以解决良好的形式和有效性的微不足道的问题,并且解决方案会更快地涌现。