Давай популярно объясню... И другим пригодится. 
Данный код взят из текста процедуры ViewXML и мне кажется наиболее простым для анализа 

1. В модуль, где надо читать XML, поместить в начало две строки объявлений 
INCLUDE('CPXML.INC'),ONCE
INCLUDE('XMLCLASS.INC'),ONCE

Если лень (а мне лень), можно на один из экранов подключить невидимую кнопку шаблона View XML . Хотя я не уверен, что это сработает в Legacy 


2. В процедуру, где мы собираемся читать XML, добавляем декларации

xmlDoc &Document,Auto
Nl &Nodelist,Auto
nnm &NamedNodeMap,auto
ANode &Node,Auto
AttrIndex Long
ListXML queue(DOMQueue) ! Очередь для считывания параметров
end

ListXMLCount Long 

3. Открываем документ на считывание 

  xmlDoc &= XMLFileToDOM(FileName)
  If xmlDoc &= Null 
     ! Документ не открылся, надо смотреть. 
     ! Например, открыть браузером и разбираться с ошибками в структуре 
  End 

  ! Считываем документ в дерево 
  FillDomQueue(XMLDoc,ListXML,1)
  ! Начинаем считывать информацию из дерева 
  ListXMLCount=1 
  ! Идём по структуре дерева вниз 
  Loop While(ListXMLCount <= Records(ListXML)) 
    ! Предположим, что у нас есть строки 
    ! <name1>
    ! <name2>
    Case lower(ListXML.Node.getNodeName()) ! Выбираем имя тэга 
    Of 'name1'
       Do ParseName1
    Of 'name2' 
       Do ParseName2 
    end 
  end
 
  Free(ListXML)
  XMLDoc.Release() 

! Теперь напишем разбор конкретных параметров 
ParseName1 Routine 
nnm &= ListXML.Node.getAttributes()
if not nnm &= null ! Есть атрибуты 
loop AttrIndex = 0 to nnm.getLength() - 1 ! Цикл по атрибутам 
Anode &= nnm.item(AttrIndex)
Case lower(ANode.GetNodename())
Of 'param1'
Param1Value=ANode.getNodeValue()
Of 'param2' 
Param2Value=ANode.getNodeValue()
... 
End
end
end
! Ну и куда-то записываем параметры считанной строки... 
nnm.release()
Exit

И ещё несколько замечаний. 

1. Если параметр имеет вид
<name> значение </name> , то значение находится не в той строке, где <name>, а в следующей. Тогда его надо читать как 

ListXMLCount+=1
Get(ListXML,ListXMLCount) ! Прочитали элемент
Value=ListXML.Node.getNodeValue()

То же самое - для значений типа CDATA и аналогичных 
2. Если поле (например, CDATA) содержит переходы на новую строку, после считывания вместо '<13>' останется только '<10>'. Если необходимо, придётся дописать... 
N10 Long
Code
ListXMLCount+=1 
Get(ListXML,listXMLCount) ! Прочитали элемент
Value=ListXML.Node.getNodeValue()
! Замены <10> на <13>'
N10=1
Loop
N10=Instring('<10>',Value,1,N10)
If N10
Value=Value [1 : N10-1] & '<13>' & Value [N10+1 : Len(Value)]
N10+=2
Else
Break
End
End

Разумеется, это самый элементарный случай. Но он охватывает процентов 99 всех документов...