• 6.XML处理


    一、读

    1.直接%XML.TextReader解析

    方法或属性说明
    Read方法获取下一个路径
    AttributeCount属性获取当前结点的xml属性个数
    LacalName属性当前属性名称
    Value属性当前属性值

    示例: 通过路径、属性名、属性值返回该结点的名属性

    // 通过路径、属性名、属性值返回该结点的名属性
    // 返回值: 动态数据,也可为传入的多维数组ReturnItem 
    ClassMethod GetItem(stream, path, attrName, value, ReturnItem = "")
    {
    	// set configuration=##class(User.DHCClinicXMLConfiguration).%OpenId(22)
    	// Set stream=configuration.XCDocumentContent
        set status=##class(%XML.TextReader).ParseStream(stream,.textreader)
        //check status
        if $$$ISERR(status) {do $System.Status.DisplayError(status) quit}
        // iterate through document, node by node
        s find=""
        s obj=""
        
        while ((find="")&&(textreader.Read()))
        {
            if (textreader.Path=path) {
    	       do FindItem()
            }
        }
        q:find=1 obj
        q ""
    FindItem()
       s obj={}
       If (textreader.NodeType="element") {
    	   // list attributes for this node
    	   For a = 1:1:textreader.AttributeCount {
    		  Do textreader.MoveToAttributeIndex(a)
    		  // Write find.LocalName," = ",find.Value,!
    		  if ((textreader.LocalName=attrName) && (textreader.Value=value)){
    		     Set find=1
    		  }
    		  d obj.%Set(textreader.LocalName,textreader.Value)
    		  s ReturnItem(textreader.LocalName)=textreader.Value
    	   }
       }
       q obj
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    2.%XML.Node类解析

    %XML.TextReader虽然写代码方便但是全局搜索路径,如果是xml数据量大时不适用

    方法名说明
    MoveToFirstChild移到到下一个子结点
    MoveToLastChild移动到最后一个子结点
    MoveToNextSibling移动到下一个兄弟结点
    MoveToPreviousSibling移动正上一个兄弟结点
    MoveToParent移动到父结点
    HasChildNodes是否有子结点
    GetNumberAttributes当前元素的属性个数
    属性名说明
    NodeId设置路径,获取路径
    LocalName当前元素名称
    NodeData结点值
    // 使用%XML.Node类解析
    set status=##class(%XML.Document).GetDocumentFromStream(stream,.document)
    Set rootNode=document.GetDocumentElement()
    do ..ShowNode(rootNode)
    do .. ShowAttributes(rootNode)
    ClassMethod ShowNode(node As %XML.Node)
    {
        Write !,"LocalName="_node.LocalName
        If node.NodeType=$$$xmlELEMENTNODE  {
            Write !,"Namespace="_node.Namespace
        }
        If node.NodeType=$$$xmlELEMENTNODE {
            Write !,"NamespaceIndex="_node.NamespaceIndex
         }
        Write !,"Nil="_node.Nil
        Write !,"NodeData="_node.NodeData
        Write !,"NodeId="_node.NodeId
        Write !,"NodeType="_node.NodeType
        Write !,"QName="_node.QName
        Write !,"HasChildNodes returns "_node.HasChildNodes()
        Write !,"GetNumberAttributes returns "_node.GetNumberAttributes()
        Set status=node.GetText(.text)
        If status {
            Write !, "Text of the node is "_text
            } else {
                Write !, "GetText does not return text"
            }
    }
    
    ClassMethod ShowAttributes(node As %XML.Node)
    {
        Set count=node.GetNumberAttributes()
        Write !, "Number of attributes: ", count
        Set first=node.FirstAttributeName()
        Write !, "First attribute is: ", first
        Write !, " Its value is: ",node.GetAttributeValue(first)
        Set next=node.NextAttributeName(first)
        For i=1:1:count-2 {
            Write !, "Next attribute is: ", next
            Write !, " Its value is: ",node.GetAttributeValue(next)
            Set next=node.NextAttributeName(next)
            }
        Set last=node.LastAttributeName()
        Write !, "Last attribute is: ", last
        Write !, " Its value is: ",node.GetAttributeValue(last)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    3.使用Cache对象解析

    需要先定义对象

    // 借用Cache对象解析
        Set reader = ##class(%XML.Reader).%New()
        Do reader.OpenStream(ret)
        While (reader.Next(.object,.sc)) {
         w object.PatName
        }
         If $system.Status.IsError(sc) do $system.OBJ.DisplayError(sc)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、写

    1.直接拼接字符串或利用流输出xml格式
    大多数非复杂结构足够使用
    2. Cache 对象转%GlobalCharacterStream

    Set obj=…
    s stream=##class(%GlobalCharacterStream).%New()
    s ret=obj.XMLExportToStream(.stream,"PatInfo")
    
    • 1
    • 2
    • 3
    1. %XML.Document
    方法说明
    CreateDocument
    AppendCharacter
    AppendChild
    AppendElement
    AppendNode
    AppendTree
    InsertNode
    InsertTree
    Remove
    RemoveAttribute
  • 相关阅读:
    TypeScript type 和 interface区别
    SpringBoot轻松实现项目集成Knife4j接口文档
    从0开始学习JavaScript--JavaScript 流程控制
    基于 Python 的地理空间绘图(附源码)
    5G通信与蜂窝模组之间的关系
    抖音分享口令url API工具
    1500万员工轻松管理,云原生数据库GaussDB让HR办公更高效
    FreeRadius 服务器环境搭建(CHAP 版)
    Power BI 自定义门户----大成
    EL表达式内置对象param和paramValues
  • 原文地址:https://blog.csdn.net/aa_qq110/article/details/126075238