1

我有以下需要使用 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 
4

3 回答 3

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之外的东西。

于 2012-06-21T13:11:37.580 回答
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>

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

于 2012-06-21T13:29:55.720 回答
0

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

For Each oItem In objMSXML.documentElement.selectNodes("ITEM") 
    oItem.selectSingleNode("TEXT").text = getInfo(objECGO.xVal("CODE", oItem ,"STR"))  
Next 
于 2012-06-21T13:27:19.027 回答