Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
4 / 4 / 0
Регистрация: 29.10.2012
Сообщений: 68

Разбор / парсинг XML

27.11.2013, 16:45. Показов 4322. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется XML файл:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="WINDOWS-1251"?>
<ФайлПФР>
    <СПИСОК_НА_ЗАЧИСЛЕНИЕ>
        <СведенияОполучателе>
            <ФИО>
                <Фамилия>ИВАНОВ</Фамилия>
                <Имя>ИВАН</Имя>
                <Отчество>ИВАНОВИЧ</Отчество>
            </ФИО>
            <НомерСчета>40817810470000000000</НомерСчета>
            <ВсеВыплаты>
                <Количество>2</Количество>
                <Выплата>
                    <СуммаКвыплате>10015.16</СуммаКвыплате>
                </Выплата>
                <Выплата>
                    <СуммаКвыплате>1922.73</СуммаКвыплате>
                </Выплата>
            </ВсеВыплаты>
        </СведенияОполучателе>
        <СведенияОполучателе>
            <ФИО>
                <Фамилия>ПЕТРОВ</Фамилия>
                <Имя>ИВАН</Имя>
                <Отчество>ИВАНОВИЧ</Отчество>
            </ФИО>
            <НомерСчета>40817810470000000001</НомерСчета>
            <ВсеВыплаты>
                <Количество>1</Количество>
                <Выплата>
                    <СуммаКвыплате>815.16</СуммаКвыплате>
                </Выплата>
            </ВсеВыплаты>
        </СведенияОполучателе>
    </СПИСОК_НА_ЗАЧИСЛЕНИЕ>
</ФайлПФР>
Нужно его распарсить и в файл записать.
Написал гомнокод:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            Dim oXML  As New MSXML2.DOMDocument30
            Dim fio, tree As String
            
            tree = "*/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе"
            Set oXML = New DOMDocument30
            oXML.async = False
            oXML.validateOnParse = False
            oXML.Load ww
            For iSved = 0 To oXML.getElementsByTagName(tree).Length
                fio = oXML.getElementsByTagName(tree + "/ФИО/Фамилия").Item(iSved).Text + " " + oXML.getElementsByTagName(tree + "/ФИО/Имя").Item(iSved).Text + " " + oXML.getElementsByTagName(tree + "/ФИО/Отчество").Item(iSved).Text
                sh = oXML.getElementsByTagName(tree + "/НомерСчета").Item(iSved).Text
                For iVyplat = 0 To oXML.getElementsByTagName(tree + "/ВсеВыплаты/Выплата").Length 
                    s = oXML.getElementsByTagName(tree + "/ВсеВыплаты/Выплата/СуммаКвыплате").Item(iVyplat).Text
                    
                    Ws = Mid(Trim(CStr(5 / 2)), 2, 1)
                    s = Replace(s, ".", Ws)
                    s = Replace(s, ",", Ws)
                    s = Replace(s, "-", Ws)
                
                    p = fio + sh + s + sDay
                
                    Print #1, AnsiToOem(p, 0, False)
                Next
            Next
На втором цикле for получаем, что элементов "*/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе/ВсеВыплаты/Выплата" 3 и при первом же проходе первого for у нас считываются все Выплаты, в независимости от Получателя. Как же считать только выплаты по текущему Получателю?

Добавлено через 2 часа 20 минут
Чую, что нужно использовать For Each ... Next
Visual Basic
1
For Each oXML.getElementsByTagName(tree + "/ВсеВыплаты/Выплата") In oXML.getElementsByTagName(tree).Item(iSved)
не канает... Это уже голова пухнет...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2013, 16:45
Ответы с готовыми решениями:

Парсинг XML не идёт разбор документа
Собственно есть код, который с малыми изменениями пользую давно. Сейчас чего-то не хочет читать XML-ку: public List&lt;URLxmlList&gt;...

Разбор (парсинг) текстового файла
Добрый день. помогите разобрать текстовик следующего содержания =102=TRAIO =1=1=1 =1=99=4MM L ...

Парсинг XML-файла с помощью LINQ to XML
Здрасивуйте. Трабл никак не могу понять в чем дело не могу считать инфу с XML login, getWorkersOUs надо записать в textBox а все c...

8
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
27.11.2013, 21:38

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Private Sub Pars()
    Dim Fam, Im, Ot, Nom, Kol, Sum, s As String, tmp As String
    Dim i As Integer, j As Integer, k As Integer
    Dim XmlBody
    Set XmlBody = CreateObject("Microsoft.XMLDOM")
    XmlBody.Async = "False"
    XmlBody.Load (App.Path & "\1.xml") 'Путь по которому находится файл XML
 
    Dim FirstNames, LastNames
    Set Fam = XmlBody.SelectNodes("ФайлПФР/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе/ФИО/Фамилия")
    Set Im = XmlBody.SelectNodes("ФайлПФР/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе/ФИО/Имя")
    Set Ot = XmlBody.SelectNodes("ФайлПФР/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе/ФИО/Отчество")
    Set Nom = XmlBody.SelectNodes("ФайлПФР/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе/НомерСчета")
    Set Kol = XmlBody.SelectNodes("ФайлПФР/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе/ВсеВыплаты/Количество")
    Set Sum = XmlBody.SelectNodes("ФайлПФР/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе/ВсеВыплаты/Выплата/СуммаКвыплате")
    For i = 0 To Fam.length - 1
       tmp = vbCrLf
       For j = 0 To CInt(Kol.Item(i).Text) - 1
           tmp = tmp & (j + 1) & "     " & Sum.Item(k).Text & vbCrLf
           k = k + 1
       Next j
       s = s & Fam.Item(i).Text & " " & _
               Im.Item(i).Text & " " & _
               Ot.Item(i).Text & " " & vbCrLf & _
               " Номер счёта   " & Nom.Item(i).Text & " " & vbCrLf & _
               " Количество выплат  " & Kol.Item(i).Text & " " & _
               tmp & " " & vbCrLf
    Next
    MsgBox s
End Sub
3
4 / 4 / 0
Регистрация: 29.10.2012
Сообщений: 68
28.11.2013, 10:45  [ТС]
А не костыль ли это?
Цитата Сообщение от SoftIce Посмотреть сообщение
Sum.Item(k).Text & vbCrLf
k = k + 1
Это же мы явно вычисляем Item для Sum.
А можно как то получить без этого вычисления все Sum, для которых, как и для текущего счета, один родитель?
Или это уж точно будет костыль?
0
Заблокирован
28.11.2013, 11:00
А интересно, есть ли такие редакторы, позволяющие переводить скрипты XML в VB ?,
в принципе ничего сложного...
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
28.11.2013, 11:07
Цитата Сообщение от ruslan_fi Посмотреть сообщение
А можно как то получить без этого вычисления все Sum, для которых, как и для текущего счета, один родитель?
ФИО не является родителем СуммаКвыплате
0
Заблокирован
28.11.2013, 11:23
Наверное я что-то не то спросил...
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
28.11.2013, 11:33
Лучший ответ Сообщение было отмечено The trick как решение

Решение

ruslan_fi,
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Pars()
    Dim Sp, t, s As String, tmp As String
    Const tree As String = "ФайлПФР/СПИСОК_НА_ЗАЧИСЛЕНИЕ/СведенияОполучателе"
    Dim i As Integer, j As Integer, k As Integer
    Dim XmlBody
    Set XmlBody = CreateObject("Microsoft.XMLDOM")
    XmlBody.Async = "False"
    XmlBody.Load (App.Path & "\1.xml") 'Путь по которому находится файл XML
    Set Sp = XmlBody.SelectNodes(tree) 'Sp - Сведения о Получателе
    For i = 0 To Sp.length - 1
       t = Split(Sp.Item(i).Text)
       tmp = ""
       For j = 1 To CInt(t(4))
           tmp = tmp & j & ".  " & t(4 + j) & vbCrLf
       Next j
       s = s & t(0) & " " & t(1) & " " & t(2) & vbCrLf & "Номер счёта " & t(3) & vbCrLf & _
           "Количество выплат " & t(4) & vbCrLf & tmp & vbCrLf
     Next
     MsgBox s
End Sub
3
4 / 4 / 0
Регистрация: 29.10.2012
Сообщений: 68
28.11.2013, 17:25  [ТС]
Цитата Сообщение от SoftIce Посмотреть сообщение
Private Sub Pars()
Здесь мало что понял.
Сделал по первому коду. Спасибо!
0
4 / 4 / 0
Регистрация: 29.10.2012
Сообщений: 68
02.12.2013, 15:41  [ТС]
А вообще, так не правильно.
Давайте как-нибудь по другому решим вопрос.
Допустим, есть файл - стандартная выгрузка НДФЛ(сваял сам -много ошибок).
В нем не указано количество "выплат". Теперь как быть?

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?xml version="1.0" encoding="windows-1251"?>
<Файл xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ИдФайл="NO_NDFL2_21_2130_7777777777777_20130311_3a34cda3-b8db-4d55-b041-17824552da27" ВерсПрог="1С:ЗУП 2.5" ВерсФорм="5.02">
    <СвРекв ОКАТО="97401000000" ОтчетГод="2012" ПризнакФ="1">
        <СвЮЛ ИННЮЛ="7725111111" КПП="213000002"/>
    </СвРекв>
    <Документ КНД="1111111" ДатаДок="11.03.2013" ОтчетГод="2012" НомСпр="175" Признак="1" КодНО="2130">
        <СвНА ОКАТО="97400000000" Тлф="222222">
            <СвНАЮЛ НаимОрг="ЧГПУ" ИННЮЛ="7725111111" КПП="213000002"/>
        </СвНА>
        <ПолучДох ИННФЛ="210301234567" Статус="1" ДатаРожд="11.07.1989" Гражд="643">
            <ФИО Фамилия="Иванов" Имя="Иван" Отчество="Иванович"/>
            <УдЛичнФЛ КодУдЛичн="21" СерНомДок="97 97 123456"/>
            <АдрМЖРФ Индекс="654321" КодРегион="21" Район="Четкий р-н" НаселПункт="Четкое с" Улица="Крепкова ул" Дом="18"/>
        </ПолучДох>
        <СведДох Ставка="13">
            <ДохВыч>
                <СвСумДох Месяц="07" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="08" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="09" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="10" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="11" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="12" КодДоход="2000" СумДоход="14000.00"/>
            </ДохВыч>
            <СГДНалПер СумДохОбщ="84000.00" НалБаза="84000.00" НалИсчисл="12616" НалУдерж="12616" НалПеречисл="12616" НалУдержЛиш="0" НалНеУдерж="0"/>
        </СведДох>
    </Документ>
    <Документ КНД="1111111" ДатаДок="11.03.2013" ОтчетГод="2012" НомСпр="175" Признак="1" КодНО="2130">
        <СвНА ОКАТО="97400000000" Тлф="222222">
            <СвНАЮЛ НаимОрг="ЧГПУ" ИННЮЛ="7725111111" КПП="213000002"/>
        </СвНА>
        <ПолучДох ИННФЛ="210301234567" Статус="1" ДатаРожд="11.07.1989" Гражд="643">
            <ФИО Фамилия="Петров" Имя="Петр" Отчество="Иванович"/>
            <УдЛичнФЛ КодУдЛичн="21" СерНомДок="97 97 123456"/>
            <АдрМЖРФ Индекс="654321" КодРегион="21" Район="Четкий р-н" НаселПункт="Четкое с" Улица="Крепкова ул" Дом="18"/>
        </ПолучДох>
        <СведДох Ставка="13">
            <ДохВыч>
                <СвСумДох Месяц="01" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="02" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="03" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="10" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="11" КодДоход="2000" СумДоход="14000.00"/>
                <СвСумДох Месяц="12" КодДоход="2000" СумДоход="14000.00"/>
            </ДохВыч>
            <СГДНалПер СумДохОбщ="84000.00" НалБаза="84000.00" НалИсчисл="12616" НалУдерж="12616" НалПеречисл="12616" НалУдержЛиш="0" НалНеУдерж="0"/>
        </СведДох>
    </Документ>
</Файл>
Добавлено через 1 час 28 минут
Наваял что-то страшное:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                using (var sw = new StreamWriter(@"D:\OloloshA\mra\2.txt", false, Encoding.Default))
                {
                    doc.Load(@openFileDialog1.FileName);
                    XmlNodeList xmlnodeFIO = doc.SelectNodes("Файл/Документ/ПолучДох/ФИО");
                    XmlNodeList xmlnodeDohod = doc.SelectNodes("Файл/Документ/СведДох/ДохВыч/СвСумДох");
                    for (int j = 0; j < xmlnodeFIO.Count; j++)
                    {
                        sw.WriteLine(xmlnodeFIO.Item(j).Attributes.Item(0).InnerText + " " + xmlnodeFIO.Item(j).Attributes.Item(1).InnerText + " " + xmlnodeFIO.Item(j).Attributes.Item(2).InnerText);
                        for (int i = 0; i < xmlnodeDohod.Count; i++)
                        {
                            if (xmlnodeFIO.Item(j).ParentNode.ParentNode == xmlnodeDohod.Item(i).ParentNode.ParentNode.ParentNode)
                            {
                                sw.WriteLine(xmlnodeDohod.Item(i).Attributes.Item(0).InnerText + " " + xmlnodeDohod.Item(i).Attributes.Item(2).InnerText);
                            }
                        }
                    }
                }
                MessageBox.Show("Выполнено!");
На выходе все, что я хотел:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Иванов Иван Иванович
07 14000.00
08 14000.00
09 14000.00
10 14000.00
11 14000.00
12 14000.00
Петров Петр Иванович
01 14000.00
02 14000.00
03 14000.00
10 14000.00
11 14000.00
12 14000.00
Все ли правильно сделал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2013, 15:41
Помогаю со студенческими работами здесь

Разбор (парсинг) выражения с комплексными числами в калькуляторе на Python
Здравствуйте. Пишу калькулятор на Python, который должен уметь работать с обычными и комплексными числами. Кратко: Помогите написать...

Разбор XML
После http запроса мне приходит ответ в формате xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt; &lt;response list=&quot;true&quot;&gt; ...

Разбор XML
Дана строка следующего вида с переменной длиной: &lt;reply&gt;&lt;process id=&quot;3135&quot;/&gt;&lt;threads&gt;&lt;thread id=&quot;-1233097872&quot;...

Разбор XML
Всем привет. Работаю в больнице, каждый месяц сдаем реестр по пролеченным больным. Написал программку по нахождению ошибок в файле...

Разбор XML
Доброго времени суток. Ребята подскажите как получить значение в этой части XML &lt;Direction Number=&quot;1&quot;&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru