Notes中LS处理XML情况

    技术2022-05-19  21

    通过dom解析XML的简单方式如下NotesDomParser.Document.DocumentElement-----getElementsByTagName("")获得子元素列表--NotesDomNodeList--循环获得list的每一个值getItem(i)----再继续循环获得以下的值通过nextsibling获得同级元素获得节点后,通过GetAttribute("属性名")获取属性值通过.firstChild获取第一个子元素。

     

    function getPersonDocs (node As NotesDOMElementNode) As Variant %REM 功能:获得Form %END REM Dim nodeList As NotesDOMNodeList Dim childList As NotesDOMNodeList Dim eNode As NotesDOMElementNode Dim childNode As NotesDOMElementNode Set nodeList = node.Getelementsbytagname("document") For i = 1 To nodeList.Numberofentries Set eNode = nodeList.Getitem(i) If Not eNode Is Nothing Then If eNode.Getattribute("form") = "Person" Then Set childList = eNode.Getelementsbytagname("item") For j = 1 To childList.Numberofentries Set childNode = childList.Getitem(j) If Not childNode Is Nothing Then If childNode.Getattribute("name") = "LastName" Then MsgBox childNode.Firstchild.Firstchild.Nodevalue End If End If Next End If End If Next End Function

     

    获得字节点

    Function GetChild(domRoot As NotesDOMElementNode,strSelect As String) As NotesDOMElementNode %REM 功能:根据传入XML结构的路径名+属性名称获得对应的节点 例如:(bookstor book[category='web'] title) 创建:ycy 2011-04-26 %END REM On Error GoTo Errorhandle Set GetChild = Nothing Dim domList As NotesDOMNodeList Dim domNode As NotesDOMElementNode Dim childNode As NotesDOMElementNode Dim varPathList As Variant Dim strAttName As String Dim strAttValue As String Dim strNodeName As String Dim i As Integer,j As Integer,m As Integer,n As Integer '解析字符串 strSelect = Replace(strSelect," "," ") strSelect = Replace(strSelect," "," ") strSelect = Replace(strSelect," "," ") strSelect = Replace(strSelect," "," ") If strSelect = "" Then Set GetChild = domRoot Exit Function End If varPathList = Split(strSelect," ") For i = 0 To UBound(varPathList) '获得属性名称、属性值 strAttName = "" strAttValue = "" strNodeName = "" If InStr(varPathList(i),"[") Then strNodeName = StrLeft(varPathList(i),"[") strAttName = StrLeft(StrRight(varPathList(i),"["),"=") strAttValue = StrLeft(StrRight(varPathList(i),"='"),"']") Else strNodeName = varPathList(i) End If '查找子节点,查看属性 Set domList = domRoot.Getelementsbytagname(strNodeName) For j = 1 To domList.Numberofentries Set childNode = domList.Getitem(j) If Not childNode Is Nothing Then '获得选择条件(如果有属性,按照属性查找,如果没有则获取第一个节点) If strAttName <> "" Then If childNode.Getattribute(strAttName) = strAttValue Then '递归获得下一层级的元素 Set GetChild = GetChild(childNode,StrRight(strSelect," ")) '遍历完成OR已经获得对应元素则退出 If j = domList.Numberofentries Or (Not GetChild Is Nothing) Then Exit Function End If End If Else '递归获得下一层级的元素 Set GetChild = GetChild(childNode,StrRight(strSelect," ")) '遍历完成OR已经获得对应元素则退出 If j = domList.Numberofentries Or (Not GetChild Is Nothing) Then Exit Function End If End If End If Next Next Exit Function Errorhandle: MsgBox "XMLTools-----GetChild------erl:" + CStr(Erl) + ", error:" + Error End Function

     

    设置字节点

    Function SetChild(domDocNode As NotesDOMDocumentNode,domNode As NotesDOMElementNode,varList As Variant,strMode As String) As NotesDOMElementNode %REM 功能: 将指定的列表值附加到某一节点下面,并可设置节点的属性值 创建: ycy 2011-04-26 参数:varList---------节点名称#*#节点值#*#属性#*#属性值 strMode---------如果有相同的节点,是否要将其节点的值改变还是直接附加(replace或者add) %END REM On Error GoTo Errorhandle Set SetChild = Nothing Dim i As Integer Dim varTmp As Variant Dim domList As NotesDOMNodeList Dim domNewNode As NotesDOMElementNode Dim docTextNode As NotesDOMTextNode Dim domChildNode As NotesDOMElementNode Dim strNodeName As String Dim strNodeValue As String Dim strAttName As String Dim strAttValue As String Dim strNewFlag As String '遍历要添加的子元素 For i = 0 To UBound(varList) If varList(i) <> "" Then varTmp = Split(varList(i),"#*#") '判断是否有属性值 If UBound(varTmp) > 1 Then strNodeName = varTmp(0) strNodeValue = varTmp(1) strAttName = varTmp(2) strAttValue = varTmp(3) Else strNodeName = varTmp(0) strNodeValue = varTmp(1) strAttName = "" strAttValue = "" End If '查找是否有相同名称的节点, If strMode = "replace" Then Set domList = domNode.Getelementsbytagname(strNodeName) If domList.Numberofentries > 0 Then Set domChildNode = domList.Getitem(1) If strNodeValue = "null" Then '如果文本节点值为空,则删除文本节点 If not domChildNode.Firstchild.Isnull Then Call domChildNode.Removechild(domChildNode.Firstchild) End If Else '如果没有文本节点则添加 If domChildNode.Firstchild.Isnull Then Set docTextNode = domDocNode.Createtextnode("#text") docTextNode.Nodevalue = strNodeValue Call domChildNode.Appendchild(docTextNode) Else domChildNode.Firstchild.Nodevalue = strNodeValue End If End If '设置属性名称 If strAttName <> "" Then Call domChildNode.Setattribute(strAttName, strAttValue) End If Set SetChild = domChildNode Else strNewFlag = "True" End If Else strNewFlag = "True" End If '生成新节点,并添加到父节点 If strNewFlag = "True" Then '创建节点 Set domNewNode = domDocNode.Createelementnode(strNodeName) '设置属性名称 If strAttName <> "null" And strAttName <> "" Then Call domNewNode.Setattribute(strAttName, strAttValue) End If Call domNode.Appendchild(domNewNode) '创建文本节点 If strNodeValue <> "null" Then Set docTextNode = domDocNode.Createtextnode("#text") docTextNode.Nodevalue = strNodeValue Call domNewNode.Appendchild(docTextNode) End If Set SetChild = domNewNode End If End If Next Exit Function Errorhandle: MsgBox "XMLTools-----SetChild------erl:" + CStr(Erl) + ", error:" + Error End Function  

     

    树结构改变之后,重新获取XML,则需要调用 

     Call domP.Serialize()

     strXML = streamOut.Readtext()-------streamOut为解析器输出流!


     

     第二种方法:

    通过SAX解析。

    Parser设置输入之后,在Process之前,需要设定在解析的时候事件。

    比较有用的两个事件

           SAX_Characters :读取叶子值

         SAX_StartElement:获取Element名称,和属性。但是不能获取下面的值。

    这个不是很好

      Set saxParser = ss.Createsaxparser(strXML) On Event SAX_Characters From saxParser Call SAXCharacters On Event SAX_StartElement From saxParser Call SAXStartElement


    最新回复(0)