Perl - Помощь при чтении строки XML через строку CMD - PullRequest
0 голосов
/ 21 марта 2011

В месте, где я работаю, есть фрагмент кода, который мы используем, когда нам нужно взаимодействовать с Perl.По сути, мы вызываем функцию, и она проходит через последовательность строк - через командную строку - в Perl в виде массива.Это прекрасно работает для большинства вещей.

Однако теперь мне нужно пройти через строку данных XML.Обычно я извлекаю элементы из массива, используя ключевое слово shift.Однако, поскольку в строке xml есть несколько пробелов, это не работает.

Я попытался написать это так:

while(shift)
{
   my $temp = shift;
   $animalXML = $animalXML.$temp;

}

Но на самом деле это не очень хорошо работает сXML-теги.Например, этот раздел:

<?xml version="1.0" encoding="utf-16"?><ToggleExclusion   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Читается и сохраняется как:

version="1.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Кто-нибудь знает, как я могу справиться с этим?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 21 марта 2011

Это не проблема Perl, это проблема цитирования из командной строки. Если вы правильно процитируете строку, она войдет в скрипт Perl как отдельный элемент ARGV, и вам не нужно будет делать никаких манипуляций.

1 голос
/ 21 марта 2011

Вы составляете одну строку и передаете ее в Run, которая затем, по-видимому (какой это язык и платформа?) Передает ее интерпретатору командной строки (cmd? /bin/sh?), Который анализирует эту команду line, интерпретирует его как имя и аргументы команды и вызывает команду с аргументами.

Интерпретатор командной строки имеет свои специальные символы со специальными значениями, например <, поэтому все вхождения таких символов должны быть надлежащим образом экранированы или заключены в кавычки с использованием любого метода, поддерживаемого интерпретатором командной строки, для передачи до командования целыми и невредимыми. Кроме того, интерпретатор командной строки будет иметь определенные ожидания от используемого набора символов, который, вероятно, не будет поддерживаться для входных строк, которые все являются UTF-16 или, что еще хуже, смесью UTF-16 и чего-то еще.

Если вы не можете изменить скрипт Perl: отключите интерпретатор командной строки, используя вариант с несколькими аргументами Run, который напрямую вызывает команду с аргументами.

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

Другая идея состоит в том, чтобы не смешивать XML с не-XML, чтобы вы могли использовать правильную библиотеку XML, такую ​​как XML :: LibXML , для анализа ввода, который позаботится о любых дальнейших проблемах цитирования / экранирования. для содержимого XML.

0 голосов
/ 21 марта 2011

Прочитайте документацию для task.Run.Проблема связана с этим.Вы ищете способ

  • либо обойти оболочку
  • , либо указать аргументы для оболочки.
...