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

Название темы: [решено] парсинг xml :)
Показать сообщение отдельно

Ветеран


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

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


Код: Выделить весь код
# Путь к файлу XML
$sSourceFile = "C:\Песочница\041\КПТ_2014-01-24.xml"

# Создаём экземпляр объекта типа «System.Xml.XmlDocument»
$oXmlDocument = New-Object -TypeName System.Xml.XmlDocument

# Загружаем содержимое файла в созданный экземпляр объекта
$oXmlDocument.load($sSourceFile)

# PowerShell умеет представлять дочерние узлы xml в виде свойств, ординалом или массивом
# (равно, как и атрибуты узла), потому мы можем просто обращаться к свойствам/атрибутам узла через точку.
#
# Для одиночного узла, свойство — ординал, мы просто «спускаемся» вниз по иерархии одиночных узлов.
# Для множества одинаковых узлов, свойство — массив, мы используем перечисление,
# передавая полученный массив узлов по конвейеру на разбор командлету «ForEach-Object».

$oXmlDocument.Region_Cadastr.Package.Cadastral_Blocks.Cadastral_Block.Parcels.Parcel |`
    ForEach-Object -Process {
        # «$_» — текущий экземпляр каждого из элементов массива, переданного по конвейеру
        # командлету «ForEach-Object». Запоминаем атрибут «CadastralNumber» текущего узла «Parcel»
        # в переменной «$sCadastralNumber»:
        $sCadastralNumber = $_.CadastralNumber

Код: Выделить весь код
        # От текущего узла «Parcel» опять «спускаемся» вниз по иерархии одиночных узлов
        # до очередного массива узлов, который так же передаём по конвейеру командлету «ForEach-Object».
        $_.Entity_Spatial.Spatial_Element.Spelement_Unit |`
            ForEach-Object -Process {

Код: Выделить весь код
                # Строим результирующую объект-строку из переменной «$sCadastralNumber»,
                # атрибутов текущего узла «Spelement_Unit» и 
                # атрибутов «X», «Y» и «Delta_Geopoint» дочернего для него узла «Ordinate»:
                "$sCadastralNumber;$($_.Su_Nmb);$($_.Ordinate.X);$($_.Ordinate.Y);$($_.Ordinate.Delta_Geopoint)"

Код: Выделить весь код
            }
    } | Out-File -FilePath "C:\Песочница\041\0001.csv" -Encoding ascii
    # ↑↑ Набор результирующих строк передаём по конвейеру командлету «Out-File», осуществляющему вывод в файл. ↑↑
Это, разумеется, не единственный способ. Возможно, удобнее будет сделать схему трансформации xsl и применять её к файлу xml.

Цитата firstarey:
всего 5 видов документов и не регулярно меняется схема документа (на данный момент уже 8). вот именно из-за изменения схемы и потребовалась помощь..
Вложения 05-01.zip »
Что, как надо извлечь, в каком виде надо представить результат.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:00, 06-03-2014 | #6

Название темы: [решено] парсинг xml :)