方法或属性 | 说明 |
---|---|
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
}
%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)
}
需要先定义对象
// 借用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")
方法 | 说明 |
---|---|
CreateDocument | |
AppendCharacter | |
AppendChild | |
AppendElement | |
AppendNode | |
AppendTree | |
InsertNode | |
InsertTree | |
Remove | |
RemoveAttribute |