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

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

Ответить
Настройки темы
PowerShell - Каким образом игнорировать и/ или удалить xmlns в заголовке xml

Аватара для NickM

Ветеран


Contributor


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


Конфигурация

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


Изменения
Автор: NickM
Дата: 29-01-2025
Уважаемые, здравствуйте!

Задался вопросом из сабжа, т.к., по какой-то причине, эти заголовки не дают корректно распарсить *.xml с помощью .SelectNodes.

Допустим, есть универсальный формат выгрузки в банк из 1с8:
Код: Выделить весь код
<?xml version="1.0" encoding="windows-1251"?>
<СчетаПК xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://v8.1c.ru/edi/edi_stnd/109" xsi:type="СчетПК" ДатаФормирования="2025-01-29" НомерДоговора="11234567890" ДатаДоговора="2020-01-01" НаименованиеОрганизации="Муниципальное бюджетное общеобразовательное учреждение" ИНН="021001001" БИК="048073601" ИдПервичногоДокумента="8d1fbfe6-2cbd-11ef-958e-00155da20c00" НомерРеестра="5" ДатаРеестра="2024-02-05">
</СчетаПК>
Сейчас думаю, каким образом этот момент обойти, эти неймспейсы:
  • каким-то образом их игнорировать;
  • модифицировать файл и вырезать их;

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

Например, вот такой простенький код получения даты и № договора без удаления этих неймспейсов не выводит ничего:
Код: Выделить весь код
[IO.Directory]::EnumerateFiles($PSScriptRoot,'*.xml') | foreach {
gci $_|%{([xml](gc $_.fullname)).SelectNodes('//СчетаПК')} | ForEach-Object {$_.НомерДоговора + " " + $_.ДатаДоговора}
}

Отправлено: 08:48, 29-01-2025

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Примерчик бы.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 09:20, 29-01-2025 | #2



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

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


Аватара для NickM

Ветеран


Contributor


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

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


В сети нашёл подсказку, что можно использовать:
Код: Выделить весь код
local-name()
, надо попробовать, главное не запутаться, т.к. это усложняет читаемость, т.е. теперь этот простой код выглядит так:
Код: Выделить весь код
[IO.Directory]::EnumerateFiles($PSScriptRoot,'*.xml') | foreach {
 gci $_|%{([xml](gc $_.fullname)).SelectNodes('//*[local-name()="СчетаПК"]')} | ForEach-Object {$_.НомерДоговора + " " + $_.ДатаДоговора} 
}
Цитата DJ Mogarych:
Примерчик бы. »
В первом сообщении приложен как пример, так и попытка чтения.

Отправлено: 09:20, 29-01-2025 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


А, я проглядел, что там дальше содержимое, а не только служебные заголовки.

Можно проще:
Код: Выделить весь код
([xml](gc C:\temp\temp.xml)).счетапк |% {"$($_.номердоговора) $($_.датадоговора)"}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 29-01-2025 в 09:34.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:25, 29-01-2025 | #4


Deadooshka


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

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


их добавляют в XmlNamespaceManager
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:30, 29-01-2025 | #5


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата NickM:
Может кто-что дельное подскажет, т.к. Сам не понимаю, почему эти неймспейсы влияют на разбор файла. »
варианты:
1.
Код: Выделить весь код
$xml = [xml](gc test.xml -raw)
$xml.getelementsbytagname('СчетаПК')
2.
Код: Выделить весь код
$xml = [xml](gc test.xml -raw)
$ns = new-object xml.xmlnamespacemanager($xml.nametable)
$ns.addnamespace('ns', $xml.documentelement.namespaceuri)
$xml.selectnodes("//ns:СчетаПК",$ns)

-------
scio me nihil scire. Ѫ


Отправлено: 11:07, 29-01-2025 | #6


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


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

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


Код: Выделить весь код
([xml](gc source.xml -enc ([Text.Encoding]::GetEncoding('Windows-1251')))).childnodes[1]

Отправлено: 14:48, 29-01-2025 | #7


Аватара для NickM

Ветеран


Contributor


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

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


Всем спасибо!

Решил остановиться на этом и приступил к написанию не эффективного кода.

Пытаюсь обойти кривую реализацию зарплатного проекта в 1с8 в централизованной бухгалтерии, когда буду выгружать кучу-сотни реестров в универсальном *.xml-формате, а после, с помощью powershell, конвертировать их в форматы трёх и более разных банков.

Вроде что-то получается, но поделиться стесняюсь, код действительно ужасен.

Отправлено: 16:33, 29-01-2025 | #8



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Каким образом можно удалить информацию о предыдущих сетевых подключениях? hAUS Microsoft Windows 7 10 02-03-2012 14:04
Каким образом идет перенаправление dzheka3d Вебмастеру 3 20-06-2011 14:00
Каким образом Windows находит перемещенные папки("Папка была перемещена или удалена") kefi Microsoft Windows NT/2000/2003 3 26-03-2008 17:21
Сменая вкладок. каким образом? Netloger Вебмастеру 14 10-09-2007 16:33
Люди нуждна помощь или совет и расскажите каким образом пост 6rey Сетевые технологии 4 28-01-2004 15:37




 
Переход