1

Тема: WSH: Обработка XML

Уважаемые. Вопрос.
Есть xml, которая выглядит вот так:

<?xml version="1.0" encoding="Windows-1251"?>
<root>
    <id>3904</id>
    <sos_login>848hRRB9Th</sos_login>
    <pfr_xmls>
        <pfr_xml code="014-001" no="014-001-052241">

<регистрационнаяИнформация>
    <датаВремяФормирования>2011-11-09T13:05:05</датаВремяФормирования>
    <списокСубъектов>
        <субъект идентификаторСубъекта="014-001-052241" типСубъекта="АбонентСЭД" имя="Name of firm">
            <списокСертификатов типПодписанта="руководитель">
                <сертификат активный="true">
MIIEZjCCBB
                </сертификат>
            </списокСертификатов>
        </субъект>
    </списокСубъектов>
</регистрационнаяИнформация>


        </pfr_xml>
        <pfr_xml code="014-004" no="014-004-012910">

<регистрационнаяИнформация>
    <датаВремяФормирования>2011-11-09T13:05:05</датаВремяФормирования>
    <списокСубъектов>
        <субъект идентификаторСубъекта="014-004-012910" типСубъекта="АбонентСЭД" имя="Name of Firm">
            <списокСертификатов типПодписанта="руководитель">
                <сертификат активный="true">
MIIEZjCCBB
                </сертификат>
            </списокСертификатов>
        </субъект>
    </списокСубъектов>
</регистрационнаяИнформация>
        </pfr_xml>
    </pfr_xmls>
</root>

Иногда в теге <pfr_xmls> может быть не две, как сейчас. а три сертификата. А то и один.
Надо весь текст от тега <РегистрационнаяИнформация> закинуть в отдельную XML и назвать его... Не важно как. А поскольку тут два сертификата, то надо создать две XML.
Соответственно, вытащив из нее имя компании и серийный номер.

У меня пока временно выглядит код вот так:


Dim DOMDocument1, Node1, tmpStr1
Set DOMDocument1 = CreateObject("MSXML2.DOMDocument")
With DOMDocument1
    .Load "C:\XML\" & basenameNEW
    if .parseError.reason <> "" Then
        MsgBox .parseError.reason,vbCritical
        WScript.Quit
    End if
    Set currNode = domdocument1.documentElement
    
    login = currNode.childNodes(1).text 'Копирую значение Логина
    WScript.Echo currNode.childNodes(1).text
    'XML1 = currNode.childNodes(2).text
    'WScript.Echo currNode.childNodes(2).text
End With

'ТУТ ДОЛЖЕН ИДТИ ВРОДЕ КАК ЦИКЛ FOR EACH. 
'ТОЛЬКО НЕ ПОНИМАЮ С КАКИМИ ПАРАМЕТРАМИ.


'Ниже сейчас разбираю одну XML. Вернее придется разобрать один из сертификатов.Но в цикле.
'Option Explicit
Dim DOMDocument, Node, tmpStr
Set DOMDocument = CreateObject("MSXML2.DOMDocument")

'Далее надо загрузить XML с первым сертификатом.

With DOMDocument
    .Load "C:\XML\" & basename 'Я так понимаю, это не надо. 
    if .parseError.reason <> "" Then
        MsgBox .parseError.reason,vbCritical
        WScript.Quit
    End if
    With .documentElement.SelectSingleNode("списокСубъектов")
        tmpStr = ""
        For Each Node in .SelectNodes("pfr_xmls")
            'tmpStr = tmpStr & "Идентификатор субъекта: " & Node.GetAttribute("идентификаторСубъекта") & vbCrlf
            'tmpStr1 = tmpStr & "Тип субъекта: " & Node.GetAttribute("идентификаторСубъекта") & vbCrlf
            'tmpStr2 = tmpStr & "имя: " & Node.GetAttribute("имя") & vbCrlf
            sNomer = Node.GetAttribute("идентификаторСубъекта")
            firm = Node.GetAttribute("имя")
            
        Next
        firm = Replace(firm,"'","")
        firm = Replace(firm,"""", "")
        firm = Replace(firm,"»", "")
        firm = Replace(firm,"«", "")
    
    End With
End With

Грубо говоря, структура такая:
- Скачивание XML. (есть)
- Считываем поле login. (есть)
- Далее циклом проходим FOR EACH по всем <pfr_xmls> :
_______ Сохраняем и формируем новый XML-файл, который начинается только с тегов <РегистрационнаяИнформация> с примерно таким же id и дописываем через "_" цифру по счету. (Пример: id 4556. Значит наши новые XML будут 4556_1, 4556_2)
_______ Вытаскиваем данные - номер и имя компании.
_______ Далее идет отсылание на почту (есть).

Основная проблема, не знаю немного структуру работы с XMLDOM

2

Re: WSH: Обработка XML

KaKTuZ пишет:

Иногда в теге <pfr_xmls> может быть не две, как сейчас. а три сертификата. А то и один.
Надо весь текст от тега <РегистрационнаяИнформация> закинуть в отдельную XML и назвать его... Не важно как. А поскольку тут два сертификата, то надо создать две XML.
Соответственно, вытащив из нее имя компании и серийный номер.

Простите за недопонимание, но Ваши мысли пока туманны.
Думаю, следующий рабочий пример на JScript будет понятен как шаблон для развития мысли?

var f = '.\\z.xml';

var xml = new ActiveXObject('MSXML2.DOMDocument');

xml.load(f);

var regInfos = xml.getElementsByTagName('регистрационнаяИнформация');

for (var i = 0; i < regInfos.length; i++) {
	var regInfo = regInfos[i];
	WScript.Echo(regInfo.xml);
	WScript.Echo();
}
( 2 * b ) || ! ( 2 * b )