Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2011, 17:46   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Разбор XML

Подобные вопросы уже были на форуме, но позволю себе поднять его ещё раз, для конкретного случая.
Имеем на входе XML файл, нужного выдернуть из него информацию о земельных участках. Заранее не известно сколько их в файле. Кроме того участки могут быть двух видов: с данными о координатах и без них.
Для упрощения возьмем вариант без координат (как их хранить еще нужно придумать).
Совершенно не умею работать с XML. Приведу пример структуры файла:
Код:
      <Package>
         <Federal CadastralNumber="00">
            <Cadastral_Regions>
               <Cadastral_Region CadastralNumber="64">
                  <Cadastral_Districts>
                     <Cadastral_District CadastralNumber="64:32">
                        <Cadastral_Blocks>
                           <Cadastral_Block CadastralNumber="64:32:073705">
                              <Area Total="5.56" Unit="059"></Area>
                              <Parcels>
                                 <Parcel CadastralNumber="64:32:073705:1" Name="01" State="01" DateCreated="2002-05-06">
                                    <Areas>
                                       <Area>
                                          <AreaCode>008</AreaCode>
                                          <Area>2262</Area>
                                          <Unit>055</Unit>
                                       </Area>
                                    </Areas>
                                    <Location>
                                       <inBounds>1</inBounds>
                                       <Address>
                                          <Code_OKATO>63243556003</Code_OKATO>
                                          <Code_KLADR>64001000105000200</Code_KLADR>
                                          <Region>64</Region>
                                          <District Name="Саратовский" Type="р-н"></District>
                                          <Locality Name="Хмелевский" Type="п"></Locality>
                                          <Street Name="Молодежная" Type="ул"></Street>
                                          <Level1 Type="д" Value="20/1"></Level1>
                                       </Address>
                                    </Location>
                                    <Category Category="003002000000"></Category>
                                    <Utilization Kind="141003000000" ByDoc="Для ведения личного подсобного хозяйства"></Utilization>
                                    <Rights>
                                         <Right>
                                            <Name>Индивидуальная  собственность</Name>
                                            <Type>001001000000</Type>
                                         </Right>
                                    </Rights>
                                    <Ground_Payments>
                                         <Ground_Payment Kind="016010000000" Value="190.95804" Unit="384" Date="2008-02-21"></Ground_Payment>
                                    </Ground_Payments>
                                 </Parcel>
Полная структура приведена в архиве.
Часть узлов не закрыто. Ни как не могу понять почему.
Приложил исходный XML и таблицу с образцом как желаемого результата на примере первого участка.
Поиск по инету навел на небольшой макрос, который позволяет выбрать по запросу нужные узлы (в текущем случае список земельных участков). Но никак не пойму как же мне формировать "вторичные" запросы по каждому участку в отдельности.
Вложения
Тип файла: rar Пример.rar (16.8 Кб, 14 просмотров)
С уважением, Алексей.

Последний раз редактировалось tae1980; 14.11.2011 в 17:49.
tae1980 вне форума Ответить с цитированием
Старый 14.11.2011, 18:07   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

tae1980

вытаскивать данные - через xpath

работа с xml - microsoft msxml parser, например гоогле msxml read xml
Rififi вне форума Ответить с цитированием
Старый 14.11.2011, 18:36   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Посмотреть примеры работы с XML можно у меня на сайте:
http://excelvba.ru/category/XML
EducatedFool вне форума Ответить с цитированием
Старый 14.11.2011, 19:30   #4
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Посмотреть примеры работы с XML можно у меня на сайте:
http://excelvba.ru/category/XML
Похоже "Программа обработки заданий на производство" это то что нужно. Но как раз здесь пример скачать и нельзя...
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 14.11.2011, 19:46   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Часть узлов не закрыто. Ни как не могу понять почему.
Если Вы считаете такую конструкцию не закрытой (<Ordinate X="-16704.59" Y="-13464.40" />), то косая черта именно и закрывает тег, так-как он не имеет внутритегового текста.
Вот эта конструкция (<Code_OKATO>63243556003</Code_OKATO>) имеет внутритеговый текст, а вот эту (<Street Name="Молодежная" Type="ул"></Street>), можно было бы записать и так - <Street Name="Молодежная" Type="ул" />
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 14.11.2011 в 19:55.
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.11.2011, 19:51   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Кто ищет ,тот всегда найдет
Код:
 XPath="/Cadastral_Blocks/Cadastral_Block[@CadastralNumber='64:32:073705']"
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 16.11.2011, 11:26   #7
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Если Вы считаете такую конструкцию не закрытой (<Ordinate X="-16704.59" Y="-13464.40" />), то косая черта именно и закрывает тег, так-как он не имеет внутритегового текста.
Вот эта конструкция (<Code_OKATO>63243556003</Code_OKATO>) имеет внутритеговый текст, а вот эту (<Street Name="Молодежная" Type="ул"></Street>), можно было бы записать и так - <Street Name="Молодежная" Type="ул" />
На мой взгляд не закрытыми являются блоки, либо я не правильно провел структурирование:
Код:
         <Federal CadastralNumber="00">
            <Cadastral_Regions>
               <Cadastral_Region CadastralNumber="64">
                  <Cadastral_Districts>
                     <Cadastral_District CadastralNumber="64:32">
                        <Cadastral_Blocks>
                           <Cadastral_Block CadastralNumber="64:32:073705">
Их видно в полном описании файла приведенном в архиве.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 16.11.2011, 11:42   #8
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
Кто ищет ,тот всегда найдет
Код:
 XPath="/Cadastral_Blocks/Cadastral_Block[@CadastralNumber='64:32:073705']"
Совершенно не понял какм это использовать. (
У меня строка:
Код:
Set objListOfNodes = xmlDoc.selectNodes("//Parcel/*")
Возвращает набор данных начиная с <Areas>. После чего я пытаюсь разобрать его в цикле
Код:
For Each objNode In objListOfNodes
    MsgBox objNode.Text
Next
Но получается ерунда... Игра с параметрами "objNode." ни к чему не приводит.
Как дальше работать с данными (как обращаться к полям, задавать пути и т.п.) совершенно не понятно. Ни одного толкового описания найти не удалось. Скорее всего я не там, а точнее, не то ищу. Так как в связи не понимаем механизмов работы, мне сложно даже сформулировать правильный вопрос.
Почему нельзя сделать так?
Код:
a=НекаяКоманда("//Parcel/Areas/Area/Area")
Получаем a=2262. Это в грубом примере.
Но похоже я снова что-то основательно не догоняю.
С уважением, Алексей.

Последний раз редактировалось tae1980; 16.11.2011 в 11:50.
tae1980 вне форума Ответить с цитированием
Старый 16.11.2011, 12:48   #9
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Но похоже я снова что-то основательно не догоняю.
А что на это ответит товарищ Маузер
Код:
Sub qqqq()

Dim xmlDoc As MSXML2.DOMDocument30
Set xmlDoc = New DOMDocument30
xmlDoc.async = False
xmlDoc.validateOnParse = False

 sFile = "C:\doc47842.xml"
xmlDoc.Load (sFile)
'MsgBox xmlDoc.XML

Dim objNode As IXMLDOMNode
Dim objListOfNodes As IXMLDOMNodeList
Dim Выбор As IXMLDOMNodeList
xmlDoc.setProperty "SelectionLanguage", "XPath"

XPath = "//Parcel[@CadastralNumber='64:32:073705:5']"
Set objListOfNodes = xmlDoc.SelectNodes(XPath)
For Each objNode In objListOfNodes
    a = objNode.baseName
    MsgBox objNode.Text
Next

Вот его ответ
End Sub
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 16.11.2011, 13:10   #10
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от doober Посмотреть сообщение
А что на это ответит товарищ Маузер
А как мне это разобрать дальше? Мне же нужна каждая цифра отдельно. При этом в цикле по участкам, что бы контролировать номер участка к которому относятся данные.
Сейчас играюсь вот с этой процедурой.
Код:
Sub MyMacro()
  Set mXML = ImportXML("c:\doc47842.xml", "//Location/*")
End Sub

Public Function ImportXML(xmlFileName As String, _
   Optional objectPath As String = "*", _
   Optional propertyPath As String = "*", _
   Optional baseCell As Range = Nothing) As DOMDocument
   ' Экспорт данных из XML-файла
   ' 1. формируется DOMDocument объект (ImportXML)
   ' 2. По заданным параметрам данные из объекта
   '   переписываются в рабочую книгу
   ' ПАРАМЕТРЫ:
   ' xmlFileName - исходный XML-файла
   ' baseCell - исходный диапазон ячеек
   ' objectPath - строка запроса (queryString) на выборку узлов
   ' propertyPath - строка запроса (queryString) на выборку свойств
   '
   Dim xmlDoc As DOMDocument
   Dim objectNodeList As IXMLDOMNodeList
   Dim objectNode As IXMLDOMElement
   Dim propertyNode As IXMLDOMElement
   Dim baseRow&, baseCol&, rowIndex&, colIndex&

   ' координаты ячеек, куда будем записывать
   If baseCell Is Nothing Then 'установка по умолчанию
    Set baseCell = ActiveCell
   End If
   baseRow = baseCell.Row
   baseCol = baseCell.Column
   
   ' создание DOMDocument объекта
   Set xmlDoc = New DOMDocument
   xmlDoc.Load xmlFileName ' загрузка XML-файла
   ' Перезапись данный в таблицу рабочей книги
   ' выбор узла
   Set objectNodeList = xmlDoc.documentElement.selectNodes(objectPath)
   If objectNodeList.Length > 0 Then
      colIndex = 0
      ' формирование заголовка таблицы
      'Set objectNode = objectNodeList(0)
      'For Each propertyNode In objectNode.selectNodes(propertyPath)
      '   ActiveSheet.Cells(baseRow, baseCol + colIndex).Value = propertyNode.nodeName
      '   colIndex = colIndex + 1
      'Next
      ' выделение заголовка таблицы (первой строки) жирным шрифтом
      'ActiveSheet.Range(Cells(baseRow, baseCol), Cells(baseRow, baseCol + colIndex)).Font.Bold = True
      ' выборка всех остальных строк таблицы
      rowIndex = 1
      For Each objectNode In objectNodeList ' все узлы
         colIndex = 0
         For Each propertyNode In objectNode.selectNodes(propertyPath)
            ActiveSheet.Cells(baseRow + rowIndex, baseCol + colIndex).Value = propertyNode.Text
         colIndex = colIndex + 1
         Next
         rowIndex = rowIndex + 1
      Next
   End If
   Set ImportXML = xmlDoc ' созданный DOMDocument
End Function
Но все равно не понял как мне грамотно разобрать файл. Скажем как мне узнать название населенного пункта для первого участка (//Location/Address/Locality Name)?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор сложного xml файла aspire89 Общие вопросы Delphi 7 27.09.2013 00:07
сформировать xml-файл на основе другого xml-файла NieL Общие вопросы Delphi 2 21.12.2010 15:49
парсер XML, не видит XML тэги supercelt PHP 3 02.11.2009 19:18
Разбор XML-документов Aiorosu БД в Delphi 0 19.07.2008 20:25
Задание на анализ и разбор xml файла JazonDinAlt Помощь студентам 3 04.05.2008 16:08