Можно я спрошу несколько в таком же ключе? Мне нужно создать трехмерный ассоциативный массив в xml-парсере. Массив первого уровня - массив атрибутов (Название атрибута как индекс, значение - значение его элемента). Элементы массива второго уровня содержат массивы первого уровня как значения, а атрибут "id" - индекс его элементов. Массив 3-го уровня как индекс содержит имя тега, как значение - элементы массива второго уровня.
Не нашел, как создать в LotusScript ассоциативный массив. Стал создавать ассоциативные списки. Двумерный ассоциативный список создается, но эти двумерные списки не хотят запихиваться в элементы массива 3-го уровня - говорит "Type mismatсh..."
XML-на такая
<Users>
<User id = "94" login = "Pupkin" password = "12345" firstname = "Вася" secondname = "Пупкин" email = "" >
</User>
<User id = "93" login = "Pipkin" password = "parolka" firstname = "Женя" secondname = "Пипкин" email = "test@test.test" >
</User>
</Users>
Вот его хочу распарсить в трехмерный массив или список
Привожу код парсера
Public Class SaxLoad ' Класс Загрузки
' ============================================================
' Это ассоциативные списки
' lAttr - одномерный, вложится в элементы lIDs , элементы lIDs - в элементы lUnits
Private lUnits List As Variant
Private lIDs List As Variant
Private lAttr List As Variant
' ============================================================
' Конструктор
Public Sub New( )
End Sub
Public Sub CreateSaxLoad
'Процедура создает парсер Sax, который распарсит xml-файл в трехмерный массив
Dim filename As String
Dim session As New NotesSession
Dim saxParser As NotesSAXParser
Dim xml_in As NotesStream
filename$ = "C:\xml\users.xml" ' open input file
Set xml_in=session.CreateStream
If Not xml_in.Open(filename$) Then
' MessageBox "Cannot open " & filename$,, "XML file error"
Exit Sub
End If
If xml_in.Bytes = 0 Then
' MessageBox filename$ & " is empty",, "XML file error"
Exit Sub
End If
Set saxParser=session.CreateSAXParser(xml_in)
' Тут события парсера. Важны эти
On Event SAX_EndElement From saxParser Call SAXEndElement
On Event SAX_StartElement From saxParser Call SAXStartElement
saxParser.Process
End Sub
' Далее переходим в событиям в парсере
' Находим элемент <User> в xml-файле
Public Sub SAXStartElement (Source As NotesSAXParser,_
ByVal elementname As String, Attributes As NotesSAXAttributeList)
Dim i As Integer, ind As Integer
If Attributes.Length > 0 Then
Dim attrname As String
For i = 1 To Attributes.Length
attrname = Attributes.GetName(i)
' Запоминаем индекс для элемента списка 2-го уровня - он равен атрибуту id
If attrname="id" Then ind=Attributes.GetValue(i)
' Список 1-го уровня ЭЛЕМЕНТ(Название)="Значение"
lAttr(attrname)=CStr(Attributes.GetValue(i))
Next
' Список 2-го уровня lIDs(значение атрибута id)= Список 1-го уровня (атрибуты в теге User). Запихнуть дает. Список получается двумерным
lIDs(ind)=lAttr
End If
End Sub
' Парсер нашел тег конца элемента User
Public Sub SAXEndElement (Source As NotesSAXParser, ByVal ElementName As String)
' Хочу создать элемент списка 3-го уровня lUnits("USER") = Массив 2-го уровня, к-рый содержит все атрибуты в тегах User, упорядоченные по id
' Ошибка здесь, он не хочет двумерный ассоциативный список запихнуть как значение элемента lUnits
lUnits(ElementName)=lIDs
End If
End Sub
Вышеприведенный код находится в библе "DataSynchronizationLS", эту библу использует агент.
Код агента
Option Explicit
Option Public
Use "DataSynchronizationLS"
Sub Initialize
Dim SL As New SaxLoad()
SL.CreateSaxLoad
End Sub
А я хотел сделать так:
lAttr("login")="Pipkin"
lAttr("id") = "94"
...
Потом этот список лежит в элементе lIDs("94") = lAttr
А lUnits("User")=Двумерный список, включающий lIDs("94") и lIDs("93")
Потом в этом трехмерном списке может быть добавлен, например, элемент lUnits("Department"), когда в xml появится тег <Department id="1"...
Но Лотус не хочет присваивать lUnits("User") двумерный список lIDs в качестве значения.
Извините, если информация оказалась лишней
Вопрос в том, могут ли быть в ЛотусСкрипте ассоциативные списки трехмерными? Или я что-то забыл. Если нет, то где я бы мог почитать про трехмерные ассоциативные массивы на java? Заранее спасибо