【问题标题】:Replace XML Node value with another Classic ASP, VB script用另一个经典 ASP、VB 脚本替换 XML 节点值
【发布时间】:2012-06-21 12:48:18
【问题描述】:

我有以下需要使用 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(code) 函数中获取它。如何使用经典的 asp 和 vbscript 替换 TEXT 值。

需要输出,

<ITEM>
    <CODE>X11</CODE> 
        <TEXT>Detailed Explanation about this error</CODE>
</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 

【问题讨论】:

  • "E112" 不是格式良好的 XML;未关闭:未关闭:ERROR、OTHER-INFO、OTHER-INFO、ERROR。
  • 抱歉 Ekkehard,我已经更新了 XML。

标签: xml asp-classic vbscript


【解决方案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 之外的东西。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      简答:

      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>
      

      格式和有效性等琐碎问题可以在发布之前解决,并且解决方案会更快地涌入。

      【讨论】:

        猜你喜欢
        • 2017-12-26
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-22
        相关资源
        最近更新 更多