Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Поиск текста в xml и запись в файл

Ответить
Настройки темы
PowerShell - Поиск текста в xml и запись в файл

Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: al-1k
Дата: 27-11-2016
Описание: Добавил файл XML
Добрый день, по аналогии из этой темы, необходимо из каталога "D:\Импорт\"с более чем 200 файлов xml извлечь данные(КПТ-Кадастровый план территории) и записать в файл csv.
Содержимое xml файлов делится на блоки по типу: 1) Parcel, 2)Building, 3)Construction
Файл 141697
КПТ.xml
Код: Выделить весь код
<Parcel CadastralNumber="74:14:0101001:2" State="01" DateCreated="1996-07-10">
<Area>
<Area>842</Area>
<Unit>055</Unit>
</Area>
<Name>01</Name>
<Location>
<inBounds>1</inBounds>
<Address>
<ns2:OKATO>75238501000</ns2:OKATO>
<ns2:KLADR>74034001000014700</ns2:KLADR>
<ns2:Region>74</ns2:Region>
<ns2:District Name="Кусинский" Type="р-н"/>
<ns2:City Name="Куса" Type="г"/>
<ns2:Street Name="Зеленая" Type="ул"/>
<ns2:Level1 Type="д" Value="2"/>
<ns2:Note>обл. Челябинская, р-н Кусинский, г. Куса, ул. Петра Уткина, дом 23</ns2:Note>
</Address>
</Location>
<Category>003002000000</Category>
<Utilization Utilization="141003000000" ByDoc="для ведения личного подсобного хозяйства"/>
<CadastralCost Value="162404.96" Unit="383"/>
</Parcel>

<ObjectRealty>
<Building CadastralNumber="74:14:0104002:201">
<ObjectType>002001002000</ObjectType>
<AssignationBuilding>204003000000</AssignationBuilding>
<Area>408.8</Area>
<Address><ns2:OKATO>75238501000</ns2:OKATO>
<ns2:KLADR>74034001000003500</ns2:KLADR>
<ns2:Region>74</ns2:Region>
<ns2:District Name="Кусинский" Type="р-н"/>
<ns2:City Name="Куса" Type="г"/>
<ns2:Street Name="Зеленая" Type="ул"/>
<ns2:Level1 Type="д" Value="2"/></Address>
<CadastralCost Value="6142363.08" Unit="383"/>
</Building>
</ObjectRealty>

<ObjectRealty>
<Construction CadastralNumber="74:14:0101002:880">
<ObjectType>002001004000</ObjectType>
<AssignationName>Производственное (промышленное)</AssignationName>
<KeyParameters><ns4:KeyParameter Type="04" Value="54"/></KeyParameters>
<Address>
<ns2:OKATO>75238501000</ns2:OKATO>
<ns2:KLADR>74034001000001100</ns2:KLADR>
<ns2:PostalCode>456940</ns2:PostalCode>
<ns2:Region>74</ns2:Region>
<ns2:District Name="Кусинский" Type="р-н"/>
<ns2:City Name="Куса" Type="г"/>
<ns2:Street Name="Михаила Бубнова" Type="ул"/>
<ns2:Level1 Type="д" Value="11"/>
<ns2:Note>Россия, Челябинская обл., г. Куса, ул. Бубнова, д. 11</ns2:Note>
</Address>
</Construction>
</ObjectRealty>

Возможно есть еще какие-то блоки, но интересуют только эти. Результат содержимого CSV должен отображаться приблезательно так с подсталенными значениями:
Код: Выделить весь код
Строка 1;Parcel CadastralNumber;Building CadastralNumber;Construction CadastralNumber;ObjectType;State;DateCreated;AssignationBuilding;AssignationName;Area;Unit;Inaccuracy;Name;OKATO;KLADR;Region;District Name;District Type;City Name;City Type;Street Name;Street Type;Level1 Type;Level1 Value;Other;Note;Category;Utilization Utilization;Utilization ByDoc;CadastralCost Value;CadastralCost Unit

Отправлено: 19:23, 26-11-2016

 

Новый участник


Сообщения: 10
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip 0503001.zip
(57.0 Kb, 7 просмотров)

Интересует любое решение способное реализовать поставленную задачу.

Отправлено: 07:08, 27-11-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 102
Благодарности: 8

Профиль | Отправить PM | Цитировать


al-1k, xml-схемы КПТ, выписок и паспортов довольно часто меняются, благо последний год не так радикально как раньше. По сути перед вами стоит задача "парсить" эти xml.

Если это касается непосредственно рабочего процесса, то имеет смысл обратить внимание на готовые продукты для работы с xml росреестра. Ищутся в интернете как "XML Конвертер росреестр". Стоят не дорого, у многих есть демо-версии для оценки функционала.

Если это какой-либо личный интерес, то рекомендую самостоятельно изучать вопрос т.к. задача довольно специфична и придется часто "допиливать" под меняющиеся условия.

В PowerShell достаточно легко обрабатывать xml.
В свое время я столкнулся с подобной задачей. Привожу пример кода для "вытягивания" кадастрового номера. Его можно легко доработать.


рабочий фрагмент
Код: Выделить весь код
$PathIn   = "D:\Импорт\"	# каталог, откуда брать xml файлы
$FilesXml = Get-ChildItem $PathIn\* -Include  *.xml
if ($FilesXml -ne $null) {
	ForEach ($FileXmlCurrent in $FilesXml) { #	каждое значение $FilesXml делаем с $FileXmlCurrent:
		$oXmlDocument = New-Object -TypeName System.Xml.XmlDocument #	создаем новый объект как xml
		$oXmlDocument.load($FileXmlCurrent) #	загружаем текущий файл в переменную обработки
		$DocType = $oXmlDocument."xml-stylesheet".split("/")[6]
		$DocVers = $oXmlDocument."xml-stylesheet".split("/")[7]
		if ($DocType -ne $null) {		# тип документа из второй строки xml
			Switch ($DocType) {			# пройдемся по известным типам документов
				KPT {					# КПТ
					Switch ($DocVers) {	# пройдемся по известным версиям документа (начал с 9, остальные старые)
						"09" {			# https://portal.rosreestr.ru/xsl/GKN/KPT/09/common.xsl
							# получаем значения в переменные #--------------------------------------------------------------
							$DocCreateDate   = $oXmlDocument.KPT.CertificationDoc.Date
							$CadastralNumber = $oXmlDocument.KPT.CadastralBlocks.CadastralBlock.CadastralNumber
							Write-Host "тип документа:" `t `t `t $DocType
							Write-Host "версия документа:" `t `t $DocVers
							Write-Host "дата создания документа:" `t $DocCreateDate
							Write-Host "кадастровый номер документа:" `t $CadastralNumber 
							start-sleep -s 5
						}
						Default { # что делать, когда версия документа отлична от 10
							Write-Host "версия кпт не 9"
							start-sleep -s 5
						}
					}
				}
				Default { # что делать, когда тип документа отличен от КПТ
					Write-Host "документ не является кпт"
					start-sleep -s 5
				}
			}
		} else {
			Write-Host "тип документа определить не удалось"
			start-sleep -s 5
		}
	}
} else {
	Write-Host "xml файлы в каталоге $PathIn не найдены"
	start-sleep -s 5
}

Отправлено: 12:42, 10-12-2016 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Поиск текста в xml и запись в файл

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск строк в файле и запись в новый файл vision-d Скриптовые языки администрирования Windows 17 06-10-2016 09:14
CMD/BAT - поиск и добавление текста в файл с условием Sta1917 Скриптовые языки администрирования Windows 8 06-07-2016 17:07
CMD/BAT - Поиск текста по файлам с записью в отдельный текстовый файл Freddy1984 Скриптовые языки администрирования Windows 0 08-02-2016 17:12
PowerShell - [решено] Поиск текста в xml и запись в файл. voleja Скриптовые языки администрирования Windows 5 16-04-2015 11:29
CMD/BAT - [решено] Поиск файла и запись результат в файл fonser Скриптовые языки администрирования Windows 7 07-04-2014 16:51




 
Переход