一、目的
因使用BP中Switch分支来区分不同节点(即接口)及流向,个人已知方法中无相关统计功能能直接获取各分支节点及流向BO(调用第三方系统)信息,且当前使用系统未封装相关模块供查询,故通过解析BP中XData的方式获取Switch-Case节点及Call调用相关信息
二、解析类中的XData数据
/// 解析类中的XData内容
/// SELECT * FROM %Dictionary.CompiledXData
/// xdataID XData表ID
/// d ##class(BOE.TEST.ClassAnalysis).XDataAnalysisTextReader("JHIP.SM.BP.View||BPL")
ClassMethod XDataAnalysisTextReader(xdataID As %String) As %Status
{
//获取XData流
s compiledXdata=##class(%Dictionary.CompiledXData).%OpenId(xdataID)
s tStream=compiledXdata.Data
If '$IsObject(tStream) s tSC=%objlasterror q
//逐行读取xml
s status=##class(%XML.TextReader).ParseStream(tStream,.textreader)
if $$$ISERR(status) do $System.Status.DisplayError(status) q
s conditionMsgCode="sy"
while textreader.Read()
{
//节点类型为element
if (textreader.NodeType="element"){
//节点路径中包含/switch/case且case为结尾
if ((textreader.Path["/switch/case")&&(textreader.Path'["/switch/case/")){ //接口switch case解析接口 element
//节点有属性
if (textreader.HasAttributes){
//移动到对应的属性节点Attribute
if (textreader.MoveToAttributeName("condition")){
s condition=textreader.Value
s len=$l(condition,"||")
for i=1:1:len{
s tepCondition=$p(condition,"||",i)
if (tepCondition["'="){
s conditionMsgCode=$tr($p(tepCondition,"action",2),"""")
if (conditionMsgCode=""){
s conditionMsgCode=$tr($p(tepCondition,"OriginalDocId",2),"""")
}
}else{
s conditionMsgCode=$tr($p(tepCondition,"=",2),"""")
}
}
//b:conditionMsgCode=""
s conditionMsgCode=$tr(conditionMsgCode,"()")
if (conditionMsgCode=""){ //如果未定义分支条件,则设置为类名
s conditionMsgCode=xdataID
}
//移动到下一个节点Node
d textreader.Read()
if (textreader.HasAttributes){
if (textreader.MoveToAttributeName("name")){
s name=textreader.Value
s ^sy(conditionMsgCode)=name
}
}else{
s ^sy(conditionMsgCode)=""
}
}
}
}
if ((textreader.Path["/switch/case/")&&(textreader.Path["/call")&&(textreader.Path'["/call/")){ //接口switch case call解析接口 element
s callName="",callTarget=""
if (textreader.HasAttributes){
if (textreader.MoveToAttributeName("name")){
s callName=textreader.Value
s ^sy(conditionMsgCode,"callName",callName)=callName
}
if (textreader.MoveToAttributeName("target")){
s callTarget=textreader.Value
s ^sy(conditionMsgCode,"callTarget",callTarget)=callTarget
}
}
}
}
}
}