另一个脚本被用作从第三方应用程序中提取信息的标记,应用程序在后台执行我不知道的其他事情。
此代码在父应用程序中工作,并生成预期的输出。
有更好的方法来编写这段代码吗?
Public Function GetParameterXml()
GetParameterXml = _
"<Parameters>" &_
"<Parameter Value='Age' Code='A' Description='Age' Type='Combo' Tooltip='Would you like the newest or oldest Reason?'>" &_
" <Options>" &_
" <Option Code='O' Description='Oldest' Value='OLD' />" &_
" <Option Code='N' Description='Newest' Value='NEW' />" &_
" </Options>" &_
"</Parameter>" &_
"</Parameters>"
End Function
'Parameter Variables
Dim Age : Set Age = Parameters.Item( Bookmark , "Age" )
' PlaceHolder Variables
Dim oNodes
Dim oNode
Set oNodes = XmlDoc.SelectNodes("Record/CelloXml/Integration/Case/ServiceEvent")
'''stop here and look around
stop
If (Age.Value = "OLD") Then
For Each iNode in oNodes(0).childNodes
If iNode.nodeName = "Service" Then
For Each jNode in iNode.childNodes
If jNode.nodeName = "Comment" Then
ReturnData = ReturnData & jNode.text & MD & ""
End If
Next
End If
Next
If Len(ReturnData) > 0 Then
ReturnData = Left(ReturnData, Len(ReturnData) - Len(MD))
Else
ReturnData = ""
End if
ElseIf (Age.Value = "NEW") Then
For Each iNode in oNodes(oNodes.length - 1).childNodes
If iNode.nodeName = "Service" Then
For Each jNode in iNode.childNodes
If jNode.nodeName = "Comment" Then
ReturnData = ReturnData & jNode.text & MD & ""
End If
Next
End If
Next
If Len(ReturnData) > 0 Then
ReturnData = Left(ReturnData, Len(ReturnData) - Len(MD))
Else
ReturnData = ""
End If
Else
ReturnData = " Hit the Else Statement "
End If发布于 2013-12-13 02:33:15
这并不一定是对:指令分隔符的错误使用,但它确实让我感到意外。实际上,我甚至会给你一颗星星:
昏暗年龄:设定年龄= Parameters.Item(书签,“年龄”)
我能想到的:指令分隔符的任何其他用途都阻碍了可读性。在这里,我发现这是一种将声明与任务结合起来的聪明方法。
然而,这一点:
Dim oNodes Dim oNode Set oNodes =oNodes
然后写成这样:
Dim xPath : xPath = "Record/CelloXml/Integration/Case/ServiceEvent"
Dim ServiceEventNodes : Set ServiceEventNodes = XmlDoc.SelectNodes(xPath)我不会提到我对对象变量名称的"o“前缀之类的东西过敏(oops刚刚这么做了),但是我想您会同意我的观点,ServiceEventNodes是一个比oNodes做梦都想要的更描述性的名字。
我跳过oNode是因为..。我一会儿就到。
“停在这里,四处看看
我将跳过Stop关键字,希望这不是生产代码。这不是一个必要的评论,但它的位置很好-停在这里,看看下面,您已经很好的If...For...If...For...If块(!)嵌套在这里。我想说的是,停在这里,用可怕的气味填满你的肺,你有两段代码是严格相同的,除了一件小事情;先决定什么是子节点,然后再迭代它们,而不管是什么Age.Value?
Dim ChildNodes
Select Case Age.Value
Case "OLD":
Set ChildNodes = ServiceEventNodes(0).childNodes
Case "NEW":
Set ChildNodes = ServiceEventNodes(ServiceEventNodes.length - 1).childNodes
Case Else:
Err.Raise 5 'invalid procedure call or argument
End Select注意,如果输入无效,这将不允许代码进一步运行。返回" Hit the Else Statement "是一件危险的事情,因为函数返回的是一个有效值,就像一切都正常一样,我不知道它是用来做什么的,但我确信" Hit the Else Statement "并不完全属于生产数据。
这就是为什么我宁愿抛出一个错误并引爆,也不愿返回一个实际上是错误消息的字符串。
这个问题已经解决了,我相信两个循环都可以通过一个小的XPath完全消除(未经测试,我认为这样可以做到):
Dim CommentNodes : Set CommentNodes = ChildNodes.SelectNodes("Service/Comment")现在,您已经得到了所要查找的节点,您可以迭代它们:
Dim CommentNode
For Each CommentNode In CommentNodes
ReturnData = ReturnData & CommentNode.Text & MD
Next我省略了& ""部分,因为它连接了一个空字符串,这只会给代码增加混乱的混乱。
最后一部分:
如果Len( ReturnData ) >0,那么ReturnData = Left(ReturnData,Len(ReturnData) - Len(MD)) ReturnData= "“如果
它似乎是针对这样一个事实,即您一开始就没有正确声明和初始化ReturnData。如果将Dim ReturnData : ReturnData = vbNullString放在循环之前的某个位置,那么如果循环导致不操作,则不需要将其分配给空字符串。
https://codereview.stackexchange.com/questions/37254
复制相似问题