Обычно код javascrypt имеет глобальную область действия приложения. Когда мы объявляем глобальную переменную в нем, есть шанс использовать ту же повторяющуюся переменную в какой-то другой области разработки для какой-либо другой цели. Из-за этого дублирования может произойти некоторая ошибка. Таким образом, мы можем избежать этих глобальных переменных, используя сразу вызывающее выражение функции, это выражение является самоисполняющимся выражением. Когда мы делаем наш код внутри этого выражения IIFE, глобальная переменная будет похожа на локальную область и локальную переменную.
Two мы можем создать IIFE
(function () {
"use strict";
var app = angular.module("myModule", []);
}());
ИЛИ
(function () {
"use strict";
var app = angular.module("myModule", []);
})();
В приведенном выше фрагменте кода « var app » теперь является локальной переменной.
Вам действительно нужно использовать только те инструменты? Они не предназначены для обработки XML, и хотя можно получить что-то, что работает нормально большую часть времени, оно не будет работать в крайних случаях, таких как кодирование, разрывы строк и т. Д.
Я рекомендую xml_grep:
xml_grep 'job' jobs.xml --text_only
Что дает результат:
programming
В ubuntu / debian xml_grep находится в пакете xml-twig-tools.
Предполагая ту же строку, ввод из stdin:
sed -ne '/<\/job>/ { s/<[^>]*>\(.*\)<\/job>/\1/; p }'
отмечает: -n
останавливает его вывод всего автоматически; -e
означает, что это однострочный (aot скрипт) /<\/job>
действует как grep; s
удаляет атрибуты opentag + и endtag; ;
- новое утверждение; p
печатает; {}
делает grep применимым к обоим утверждениям как к одному.
Как насчет:
cat a.xml | grep '<job' | cut -d '>' -f 2 | cut -d '<' -f 1
< a.xml | grep ...
, вы становитесь еще ближе к началу.
– Thor
23 August 2012 в 14:11
просто используйте awk, не нужно использовать другие внешние инструменты. Ниже работает, если ваши нужные теги отображаются в мультитине.
$ cat file
test
<job xmlns="http://www.sample.com/">programming</job>
<job xmlns="http://www.sample.com/">
programming</job>
$ awk -vRS="</job>" '{gsub(/.*<job.*>/,"");print}' file
programming
programming
</ job>
действительно, но ваш скрипт не распознает его. <!-- </job> -->
- комментарий, который нужно игнорировать (и <!CDATA[[ </job> ]]>
- это литеральные данные), но ваш скрипт не знает , что i>. И тогда есть такие случаи, как DTD, который определяет новые макросы, так что &foo;
расширяется до локального значения, а простые случаи, такие как необходимость конвертировать &
в &
. Попытка перевернуть собственный анализ XML (или, что еще хуже, поколение) приводит к тому, что не будут завершаться угловые случаи и небольшие детали, которые необходимо индивидуально пропустить и зафиксировать.
– Charles Duffy
25 September 2017 в 14:28
Использование xmlstarlet:
echo '<job xmlns="http://www.sample.com/">programming</job>' | \
xmlstarlet sel -N var="http://www.sample.com/" -t -m "//var:job" -v '.'
xmlstarlet
- это всего лишь один. Другие включают xmllint
, xpath
и т. Д. См. stackoverflow.com/questions/15461737/…
– tripleee
10 June 2015 в 07:28
Немного поздно для показа.
xmlcutty вырезает узлы из XML:
$ cat file.xml
<?xml version="1.0" encoding="utf-8"?>
<job xmlns="http://www.sample.com/">programming</job>
<job xmlns="http://www.sample.com/">designing</job>
<job xmlns="http://www.sample.com/">managing</job>
<job xmlns="http://www.sample.com/">teaching</job>
Аргумент path
называет путь к элемент, который вы хотите вырезать. В этом случае, поскольку мы вообще не интересуемся тегами, мы переименовываем тег в \n
, поэтому получаем хороший список:
$ xmlcutty -path /job -rename '\n' file.xml
programming
designing
managing
teaching
Обратите внимание, что XML недействителен для начните с (нет корневого элемента). xmlcutty может работать и со сломанным XML.
Пожалуйста, не используйте синтаксический анализ на основе строк и регулярных выражений в XML. Это плохая идея. Вы можете иметь семантически идентичный XML с различным форматированием, а регулярное выражение и анализ на основе строк просто не могут справиться с ним.
Такие вещи, как унарные теги и перенос переменных строк - эти фрагменты «говорят» одно и то же:
<root>
<sometag val1="fish" val2="carrot" val3="narf"></sometag>
</root>
<root>
<sometag
val1="fish"
val2="carrot"
val3="narf"></sometag>
</root>
<root
><sometag
val1="fish"
val2="carrot"
val3="narf"
></sometag></root>
<root><sometag val1="fish" val2="carrot" val3="narf"/></root>
Надеюсь, это дает понять, почему создание парсера с регулярным выражением / линией затруднено ? К счастью, вам не нужно. Многие языки сценариев имеют как минимум один, а иногда и более синтаксический анализ.
Как уже упоминался предыдущий плакат - xml_grep
. Это инструмент, основанный на библиотеке XML::Twig
perl. Однако то, что он делает, это использовать выражения «xpath», чтобы найти что-то и различать структуру документа, атрибуты и «контент».
Например:
xml_grep 'job' jobs.xml --text_only
Однако в интересах получения более качественных ответов, вот несколько примеров «сворачивать свои собственные» на основе ваших исходных данных:
Первый способ:
Используйте twig handlers
, который захватывает элементы определенного типа и действует на них. Преимущество этого метода заключается в том, что он анализирует XML «как вы идете» и позволяет вам изменять его в полете, если вам нужно. Это особенно полезно для отбрасывания «обработанного» XML, когда вы работаете с большими файлами, используя purge
или flush
:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new(
twig_handlers => {
'job' => sub { print $_ ->text }
}
)->parse( <> );
, которые будут использовать <>
для ввода ввода (в , или задается с помощью командной строки ./myscript somefile.xml
) и обрабатывать его - каждый элемент job
, он будет извлекать и распечатывать любой связанный текст. (Возможно, вы захотите print $_ -> text,"\n"
вставить строку перевода).
Поскольку он совпадает с элементами «задания», он также будет соответствовать на вложенных элементах задания:
<job>programming
<job>anotherjob</job>
</job>
будет совпадать дважды, но дважды напечатать часть вывода. Однако, если вы предпочитаете, вы можете выбрать /job
. Использование - это позволяет вам, например. распечатать и удалить элемент или скопировать и вставить одно изменение структуры XML.
Альтернативно - сначала проанализируйте и «напечатайте» на основе структуры:
my $twig = XML::Twig->new( )->parse( <> );
print $twig -> root -> text;
Поскольку job
является вашим корневым элементом, все, что нам нужно, это распечатать его текст.
Но мы можем быть немного более проницательными и искать job
или /job
и печатать, что специально вместо этого:
my $twig = XML::Twig->new( )->parse( <> );
print $twig -> findnodes('/job',0)->text;
Вы можете использовать XML::Twig
s pretty_print
, чтобы переформатировать ваш XML тоже:
XML::Twig->new( 'pretty_print' => 'indented_a' )->parse( <> ) -> print;
Существует множество вариантов формата вывода, но для более простого XML (например, вашего) большинство будет выглядеть очень похоже.
grep '<job' file_name | cut -f2 -d">"|cut -f1 -d"<"
Использование команды sed:
Пример:
$ cat file.xml
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
$ cat file.xml | sed -ne '/<heading>/s#\s*<[^>]*>\s*##gp'
Reminder
Объяснение:
cat file.xml | sed -ne '/<pattern_to_find>/s#\s*<[^>]*>\s*##gp'
n
- подавить печать всех строк e
- script
/<pattern_to_find>/
- находит строки, содержащие указанный шаблон, что может быть, например, <heading>
next - это замещающая часть s///p
, который удаляет все, кроме желаемого значения, где /
заменяется на #
для лучшей читаемости:
s#\s*<[^>]*>\s*##gp
\s*
- включает белые пробелы, если они существуют (то же самое в конце) <[^>]*>
представляет <xml_tag>
как альтернативную альтернативу нерегулярному регулярному выражению <.*?>
не работает для sed g - заменяет все, например, закрытие тега xml </xml_tag>