Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Подскажите как получить текст расположенный между тегами (http://forum.oszone.net/showthread.php?t=257380)

dark-------13 29-03-2013 12:17 2121381

[решено] Подскажите как получить текст расположенный между тегами
 
Здравствуйте,

Подскажите пожалуйста какими функциями воспользоваться, чтобы получить текст расположенный между тегами
Пример:
<signature>asdjkf05545jaskld5455451fjkljas564545kldjfkl;nmeje115787855ejegh</signature>

Vadikan 29-03-2013 12:56 2121414

dark-------13, в Powershell:

Код:

[xml]$text = Get-Content C:\test\test.txt
$text.signature


dark-------13 29-03-2013 14:31 2121481

Сделал так
Код:

$conf = "D:\base64\obr.xml" [xml]$config = get-content $conf $config.PORTRAIT $config | Out-File D:\base64\newfile.xml Write-Host $config
Данные не выводит почему-то ..... :(

dark-------13 29-03-2013 14:50 2121494

И так пробовал
Код:

$xmldata = get-content "D:\base64\obr.xml" $global:xmldata = get-content "D:\base64\obr.xml" $xmldata.TodoList.Task | %{$_.CLIENTS.CLIENT.PORTRAIT} | select-object -unique $xmldata.CLIENTS.CLIENT.PORTRAIT
Не выдает список с данными

Vadikan 29-03-2013 15:18 2121522

dark-------13, может быть, пора показать файл или его фрагмент, достаточный для анализа? Конфиденциальные данные замените на бла-бла.

dark-------13 30-03-2013 10:53 2122070

Пример:
Текст который заключен в тег signature расположен не в одну строку, а в несколько строк
<clients>
<img>55564645271</img>
<signature> sddfsdfs45454555dfsfd
sdfsdfsdfdssdsdsddddff54454545ffff
ddffddfdffdfddf</signature>
<tag>Солнце</tag>
</clients>

Vadikan 30-03-2013 11:23 2122078

dark-------13, ну тогда так:
Код:

[xml]$text = Get-Content C:\test\test.txt
$text.clients.signature #вывод "как есть"
$text.clients.signature.replace("`n","") #вывод в одну строку

Вам нужно все узлы XML последовательно прописать перед signature.

dark-------13 30-03-2013 11:32 2122088

Вот такое не обрабатывает:


<?xml version="1.0" encoding="utf-8"?>
<CLIENTS>
<CLIENT>
<ANKETA_ID>1008393</ANKETA_ID>
</CLIENT>
</CLIENTS>

Vadikan 30-03-2013 11:37 2122090

Да все обрабатывает...
Код:

$text.clients.client.anketa_id
Покажите команду, которую вы используете.

P.S. Сначала вставляйте код в поле сообщения, потом выделяйте и жмите # на панели.

dark-------13 30-03-2013 12:05 2122109

Команда ниже разве не должна выводить текст расположенный между тегами anketa_id
Код:

[xml]$text = Get-Content D:\base64\obr.xml $text.clients.client.anketa_id
Если написать так
[xml]$text = Get-Content D:\base64\obr.xml $text.clients.client
то выдает то что между тегами client

Vadikan 30-03-2013 12:26 2122122

Цитата:

Цитата dark-------13
разве не должна выводить текст расположенный между тегами anketa_id »

Должна, если только вы ее в две строки напишете.
Цитата:

Цитата dark-------13
Если написать так
[xml]$text = Get-Content D:\base64\obr.xml $text.clients.client
то выдает то что между тегами client »

Так и должно быть.

Если честно, я не понимаю, в чем ваша проблема. Вы показываете мне разные фрагменты файлов каждый раз, причем в отрыве от команд.

В общем, последовательно указывайте узлы XML, и будет выводиться тот, что указан последним.

dark-------13 30-03-2013 12:46 2122132

Сейчас xml документ выглядит так


<?xml version="1.0" encoding="utf-8"?>
<CLIENTS>
<CLIENT>
<ANKETA>
1008393
</ANKETA>


Команду даю такую
Код:

[xml]$text = Get-Content D:\base64\obr.xml 
$text.clients.client.anketa

и ничего не выдает

Пробовал использовать эту же команду с документом
<?xml version="1.0" encoding="utf-8"?>
<CLIENTS>
<CLIENT>
<ANKETA>1008393</ANKETA>
Эффекта ноль

Vadikan 30-03-2013 13:25 2122160

Цитата:

Цитата dark-------13
и ничего не выдает »

Да? И никаких ошибок не пишет? А мне говорит
Код:

Не удается преобразовать значение "System.Object[]" в тип "System.Xml.XmlDocument". Ошибка: "Непредусмотренный конец файла. Не закрыты следующие элементы: CLIENT, CLIENTS., строка 4, позиция 25."
Теги надо закрыть,
Код:

<?xml version="1.0" encoding="utf-8"?>
<CLIENTS>
<CLIENT>
<ANKETA>1008393</ANKETA>
</CLIENT>
</CLIENTS>

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

Что характерно, в сообщении 8 теги были закрыты. Вы их удалили - ничего не работает. Ну так ССЗБ.

dark-------13 30-03-2013 13:45 2122175

Спасибо за помощь и терпение Vadikan, пример полного документа не привожу т.к. в нем 65000 строк которые пришлось бы править суть понял - буду искать ошибку в xml документе, когда теги закрыты ищет все как положено в тестовом xml документе.

Vadikan 30-03-2013 13:51 2122179

dark-------13, возможно, XML не валидный. Попробуйте http://www.xmlvalidation.com/

dark-------13 30-03-2013 13:54 2122181

Вопрос, - а как такой файл обрабатывать если нужно вытащить данные из тега anketa ?

<?xml version="1.0" encoding="utf-8"?>
<CLIENTS>
<CLIENT>
<ANKETA>1008</ANKETA>
</CLIENT>
<CLIENT>
<ANKETA>2055508</ANKETA>
</CLIENT>
</CLIENTS>

Vadikan 30-03-2013 14:21 2122196

dark-------13, гм... да точно так же.
Код:

[xml]$text = Get-Content "C:\test\test.xml"
$text.clients.client.anketa

Рез-т
Код:

1008
2055508

P.S. Предчувствую следующий вопрос - как связать данные из anketa с client...

dark-------13 30-03-2013 14:26 2122200

Вот что выдает
Код:

PS C:\Users\A> [xml]$text = Get-Content "D:\base64\new.xml"
$text.clients.client.anketa

Сохранил код скрипта, запустил еще раз выдает
Код:

PS C:\Users\A> D:\батники рабочие ---\ping_do_new\БезИмени2.ps1
Почемуто у меня не выполняется на тестовом файле

Предыдущий скрипт у меня должен выдавать тоже, что и у вас, но ни чего не выдает - после выполнения скрипта.
Если исправляю xml так то можно выбрать данные только таким скриптом

Код:

PS C:\Users\A> [xml]$text = Get-Content "D:\base64\new.xml"
$text.clients.client1.anketa1

<?xml version="1.0" encoding="utf-8"?>
<CLIENTS>
<CLIENT1>
<ANKETA1>1008</ANKETA1>
</CLIENT1>
<CLIENT2>
<ANKETA2>2055508</ANKETA2>
</CLIENT2>
</CLIENTS>

Vadikan 30-03-2013 14:38 2122210

dark-------13, а вы уберите кириллицу и пробелы из пути
Код:

iex D:\scripts\xml.ps1

dark-------13 30-03-2013 14:44 2122214

Создал и сохранил файл test.xml в папке test на диске C
Переименовал и сохранил там же скрипт 1.ps1
После выполнения такая ерунда
PS C:\Users\A> C:\test\1.ps1
Скрипты выполняются от имени администратора в Powershell_ISE.exe

Если делаю так
Код:

[xml]$text = Get-Content "C:\test\test.xml"
$text.clients.client

То выдает

ANKETA
------
1008
2055508

Что-то я запутался при каком коде и что он должен выводить ??? Данные я то получить получил, но когда мы обратились к полю anketa командой $text.clients.client.anketa почему он не выводит данные, и должен ли выводить ???

Когда идет такой код в xml

<?xml version="1.0" encoding="utf-8"?>
<CLIENTS>
<CLIENT>
<ANKETA>1008
sdjkjhdjfh
</ANKETA>
</CLIENT>
<CLIENT>
<ANKETA>2055508</ANKETA>
</CLIENT>
</CLIENTS>


Данные выводит так не выводит символы sdjkjhdjfh, что очень необходимо - потому, что в xml документе, тегов содержащих текст на разных строках очень много и именно эти данные нужно выбрать !!!
ANKETA
------
1008...
2055508

Vadikan 30-03-2013 15:12 2122234

Цитата:

Цитата dark-------13
Код:

[xml]$text = Get-Content "C:\test\test.xml"
$text.clients.client

То выдает
ANKETA
------
1008
2055508 »

Угу, ведь вы не указали во второй строке кода узел anketa.

Еще раз вернемся к сообщению 7:
Код:

[xml]$text = Get-Content C:\test\test.txt
$text.clients.client.anketa #вывод "как есть"
$text.clients.client.anketa.replace("`n","") #вывод в одну строку

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

dark-------13 30-03-2013 15:25 2122241

Применяю данный скрипт
Код:

[xml]$text = Get-Content C:\test\test.xml
$text.clients.client.anketa.replace("`n","")

ДЛЯ xml c содержимым

<?xml version="1.0" encoding="utf-8"?>
<CLIENTS>
<CLIENT>
<ANKETA>1008
sdjkjhdjfh
</ANKETA>
</CLIENT>
<CLIENT>
<ANKETA>2055508</ANKETA>
</CLIENT>
</CLIENTS>


Выдает ошибку:
Нельзя вызвать метод для выражения со значением NULL.
C:\test\1.ps1:2 знак:36
+ $text.clients.client.anketa.replace <<<< ("`n","")
+ CategoryInfo : InvalidOperation: (replace:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

Как должен выглядеть скрипт чтобы обработать xml документ данного типа и получить на выходе данные из двух тегов anketa в одном из которых значение 1008sdjkjhdjfh ,а во втором 2055508 !?

Kazun 30-03-2013 16:15 2122272

PS > $x.CLIENTS.CLIENT[0].ANKETA
1008
sdjkjhdjfh
PS > $x.CLIENTS.CLIENT[1].ANKETA
2055508
PS > $x.CLIENTS.CLIENT[0].ANKETA.replace("`n","")
1008 sdjkjhdjfh

dark-------13 30-03-2013 18:50 2122381

Уважаемый Kazun спасибо за помощь, после вашей подсказки родился вот такой скрипт, вот только не пойму как сделать так, чтобы он закончил обрабатывать файл - после обработки всех строк из xml документа, количество строк может меняться после изменений вносимых в XML, и выгрузить результат работы скрипта в файл ..... ?
Код:

[xml]$text = Get-Content "D:\base64\obr.xml"
$a="<img src=""data:image/png;base64,"
$b=""" />"
$s=1
while ($s -le 175){
   
    for ($i = 1; $i -le 1 ;$i++){write $a;
    $text.clients.client[$s].portrait;
    write $b;
   
        } 
    $s++
}


Kazun 30-03-2013 19:15 2122405

[xml]$text = Get-Content "D:\base64\obr.xml"
$text.CLIENTS.client | Foreach {"<img src=""data:image/png;base64," + $_.portrait + """ />" } | Out-File result.txt


Время: 19:43.

Время: 19:43.
© OSzone.net 2001-