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
}

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)
}

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.直接拼接字符串或利用流输出xml格式
大多数非复杂结构足够使用
2. Cache 对象转%GlobalCharacterStream

Set obj=…
s stream=##class(%GlobalCharacterStream).%New()
s ret=obj.XMLExportToStream(.stream,"PatInfo")
  1. %XML.Document
方法说明
CreateDocument
AppendCharacter
AppendChild
AppendElement
AppendNode
AppendTree
InsertNode
InsertTree
Remove
RemoveAttribute
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值