首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从内部第三方应用程序中提取XML中的特定数据

从内部第三方应用程序中提取XML中的特定数据
EN

Code Review用户
提问于 2013-12-12 20:20:17
回答 1查看 879关注 0票数 2

另一个脚本被用作从第三方应用程序中提取信息的标记,应用程序在后台执行我不知道的其他事情。

此代码在父应用程序中工作,并生成预期的输出。

有更好的方法来编写这段代码吗?

代码语言:javascript
复制
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
EN

回答 1

Code Review用户

发布于 2013-12-13 02:33:15

加入声明和赋值

这并不一定是对:指令分隔符的错误使用,但它确实让我感到意外。实际上,我甚至会给你一颗星星:

昏暗年龄:设定年龄= Parameters.Item(书签,“年龄”)

我能想到的:指令分隔符的任何其他用途都阻碍了可读性。在这里,我发现这是一种将声明与任务结合起来的聪明方法。

然而,这一点:

Dim oNodes Dim oNode Set oNodes =oNodes

然后写成这样:

代码语言:javascript
复制
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

代码语言:javascript
复制
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完全消除(未经测试,我认为这样可以做到):

代码语言:javascript
复制
Dim CommentNodes : Set CommentNodes = ChildNodes.SelectNodes("Service/Comment")

现在,您已经得到了所要查找的节点,您可以迭代它们:

代码语言:javascript
复制
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放在循环之前的某个位置,那么如果循环导致不操作,则不需要将其分配给空字符串。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/37254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档