Парсинг XML - правильные языки сценариев / пакеты для задания?

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

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

После этого, думайте о повреждающихся зависимостях, заменяя одиночные элементы, консолидацию.

9
задан nedblorf 29 October 2009 в 16:55
поделиться

12 ответов

Если вы используете Perl, то я бы рекомендовал XML :: Simple :

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

10
ответ дан 4 December 2019 в 06:05
поделиться

XML :: Twig очень хорош, особенно потому, что он не такой подробный, как некоторые другие варианты.

10
ответ дан 4 December 2019 в 06:05
поделиться

Для чистого синтаксического анализа XML я бы не стал использовать Java, C #, C ++, C и т. Д. Они имеют тенденцию к чрезмерному усложнению, например, вы хотите банан, а с ним гориллу. .

Более подходят высокоуровневые и интерпретируемые языки, такие как Perl, PHP, Python, Groovy. Perl включен практически в каждый дистрибутив Linux, как и PHP по большей части.

Я недавно использовал Groovy специально для этого, и это оказалось очень просто. Имейте в виду, что синтаксический анализатор C будет на несколько порядков быстрее, чем, например, Groovy.

7
ответ дан 4 December 2019 в 06:05
поделиться

Все это будет в библиотеках.

Python имеет отличные библиотеки для XML. Я предпочитаю lxml . Он использует libxml / libxslt, поэтому он работает быстро, но привязка Python делает его действительно простым в использовании. В Perl вполне могут быть не менее замечательные объектно-ориентированные библиотеки.

6
ответ дан 4 December 2019 в 06:05
поделиться

Я видел, что люди рекомендуют XML :: Simple, если вы выбираете Perl.

Хотя XML :: Simple действительно очень прост в использовании и хорош, это парсер DOM. Как таковой, он, к сожалению, совершенно не подходит для обработки больших XML-файлов, поскольку вашему процессу будет не хватать памяти (это обычная проблема для любого парсера DOM , не ограничиваясь XML :: Simple или Perl).

Итак, для больших файлов вы должны выбрать синтаксический анализатор SAX на любом языке, который вы выберете (в Perl есть много синтаксических анализаторов XML SAX или используйте другой потоковый синтаксический анализатор, например XML :: Twig, который даже лучше, чем стандартный синтаксический анализатор SAX. Может не говорю для других языков).

4
ответ дан 4 December 2019 в 06:05
поделиться

Не совсем язык сценариев, но вы также можете рассмотреть Scala . Вы можете начать с здесь .

3
ответ дан 4 December 2019 в 06:05
поделиться

Поддержка XML в Scala довольно хороша, особенно потому, что XML можно просто ввести непосредственно в программы Scala.

Microsoft также сделала несколько интересных интегрированных вещей с их LINQ для XML

Но мне очень нравится Elementtree , и сам по себе этот пакет - хорошая причина использовать Python вместо Perl;)

Вот пример:

import elementtree.ElementTree as ET

# build a tree structure
root = ET.Element("html")

head = ET.SubElement(root, "head")

title = ET.SubElement(head, "title")
title.text = "Page Title"

body = ET.SubElement(root, "body")
body.set("bgcolor", "#ffffff")

body.text = "Hello, World!"

# wrap it in an ElementTree instance, and save as XML
tree = ET.ElementTree(root)
tree.write("page.xhtml")
3
ответ дан 4 December 2019 в 06:05
поделиться

Это не язык сценариев, но Scala отлично подходит для работы с XML изначально . Также см. Эту книгу (черновик) Бурака .

2
ответ дан 4 December 2019 в 06:05
поделиться

Python имеет неплохую поддержку XML. От стандартных библиотечных пакетов DOM до гораздо большего количества «питонических» библиотек, которые анализируют XML непосредственно в более пригодные для использования объектные структуры.

На самом деле нет «правильного» языка ... в настоящее время существуют хорошие XML-пакеты для большинства языков.

1
ответ дан 4 December 2019 в 06:05
поделиться

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

В нашем процессоре есть конструкция, называемая стеком. Стек - это логическая конструкция, наложенная на физическую память. Допустим, наша оперативная память существует по адресам от E000 до FFFF. Это означает, что наша запущенная программа может использовать эту память любым удобным нам способом. Давайте представим, что наша операционная система говорит, что от E000 до EFFF - это стек, а от F000 до FFFF - это куча.

Стек поддерживается аппаратным обеспечением и машинными инструкциями. Нам действительно нечего делать, чтобы поддерживать его. Все, что нам (или нашей ОС) нужно сделать, это убедиться, что мы установили правильный адрес для начала стека. Указатель стека - это физический объект, находящийся в аппаратном обеспечении (процессоре) и управляемый инструкциями процессора. В этом случае наш указатель стека будет установлен в EFFF (при условии, что стек растет НАЗАД, что довольно часто, -). В скомпилированном языке, таком как C, когда вы вызываете функцию, он передает все аргументы, которые вы передали функции в стеке. Каждый аргумент имеет определенный размер. int обычно 16 или 32 бит, char обычно 8 бит и т. д. Давайте представим, что в нашей системе int и int * 16 бит. Для каждого аргумента указатель стека ЗАКРЕПЛЕН (-) на sizeof (аргумент), и аргумент копируется в стек. Затем любые переменные, которые вы объявили в области видимости, помещаются в стек таким же образом, но их значения не инициализируются.

Давайте еще раз рассмотрим два примера, аналогичные вашим двум.

int hello(int eeep)
{
    int i;
    int *p;
}

Что происходит здесь, в нашем 16- Битовая система следующая: 1) поместите eeep в стек. Это означает, что мы уменьшаем указатель стека до EFFD (потому что sizeof (int) равен 2), а затем фактически копируем eeep по адресу EFFE (текущее значение нашего указателя стека, минус 1, потому что наш указатель стека указывает на первое доступное место после выделения). Иногда есть инструкции, которые могут сделать и то, и другое одним махом (при условии, что вы копируете данные, которые умещаются в регистре. В противном случае вам придется вручную скопировать каждый элемент типа данных в нужное место в стеке - порядок имеет значение! ).

2) создать место для i. Вероятно, это означает просто уменьшение указателя стека до EFFB.

3) Создайте место для p. Вероятно, это означает просто уменьшение указателя стека до EFF9.

Затем наша программа запускается, запоминая, где находятся наши переменные (eeep начинается с EFFE, i - с EFFC, а p - с EFFA). ) попадает в этот черный ящик, называемый HEAP, и получает адрес свободной памяти. Наша операционная система будет управлять кучей за нас, но мы должны сообщить ей, когда нам нужна память и когда мы закончим с ней.

В этом примере, когда мы вызываем malloc (), ОС вернет блок 2 байта (sizeof (int) в нашей системе - 2), давая нам начальный адрес этих байтов. Допустим, первый звонок дал нам адрес F000. Затем ОС отслеживает, что адреса F000 и F001 используются в настоящее время. Когда мы вызываем free (p), ОС находит блок памяти, на который указывает p, и отмечает 2 байта как неиспользуемые (потому что sizeof (star p) равен 2). Если вместо этого мы выделим больше памяти, адрес F002, скорее всего, будет возвращен как начальный блок новой памяти. Обратите внимание, что malloc () сам по себе является функцией. Когда p помещается в стек для вызова malloc (), p снова копируется в стек по первому открытому адресу, у которого достаточно места в стеке, чтобы соответствовать размеру p (вероятно, EFFB, потому что на этот раз мы поместили в стек только 2 вещи размера 2, а sizeof (p) равно 2), и указатель стека снова уменьшается до EFF9, а malloc () помещает свои локальные переменные в стек, начиная с этого места. Когда malloc завершает работу, он выталкивает все свои элементы из стека и устанавливает указатель стека таким, каким он был до его вызова. Возвращаемое значение malloc (), пустая звезда, скорее всего, будет помещено в какой-то регистр (обычно это аккумулятор во многих системах) для нашего использования.

В реализации оба примера ДЕЙСТВИТЕЛЬНО не так просты. Когда вы выделяете стековую память для вызова новой функции, вы должны убедиться, что вы сохранили свое состояние (сохраните все регистры), чтобы новая функция не работала. t стереть значения навсегда. Обычно при этом их тоже помещают в стек. Таким же образом вы обычно сохраняете регистр счетчика программы, чтобы вы могли вернуться в нужное место после возврата из подпрограммы. Менеджеры памяти используют собственную память, чтобы «запомнить», какая память была выдана, а какая нет. Виртуальная память и сегментация памяти еще больше усложняют этот процесс, и алгоритмы управления памятью должны постоянно перемещать блоки (и защищать их тоже), чтобы предотвратить фрагментацию памяти (отдельная тема), и это связано с виртуальной памятью. также. Второй пример - действительно большая банка червей по сравнению с первым примером. Кроме того, запуск нескольких процессов значительно усложняет все это, поскольку каждый процесс имеет свой собственный стек, и к куче может получить доступ более чем один процесс (что означает, что он должен защищать себя). Кроме того, каждая архитектура процессора отличается. Некоторые архитектуры ожидают, что вы установите указатель стека на первый свободный адрес в стеке, другие будут ожидать, что вы укажете его на первое несвободное место.

Я надеюсь, что это помогло. пожалуйста, дайте мне знать.

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

edit: звездочки не отображаются. я заменил их словом «звезда»


. Как бы то ни было, если мы будем использовать (в основном) тот же код в примерах, заменив «hello» на «example1» и «example2» соответственно, мы получим следующую сборку вывод для инфа на wndows.

0
ответ дан 4 December 2019 в 06:05
поделиться

Я бы сказал, что это зависит от всего остального. VB.NET 2008 использует XML-литералы, имеет IntelliSense для LINQ to XML и несколько мощных игрушек, которые помогают превратить XML в XSD . Лично я считаю, что если вы работаете в среде .NET, это лучший выбор.

0
ответ дан 4 December 2019 в 06:05
поделиться

Если вы собираетесь использовать Ruby для этого, тогда вам нужно будет взглянуть на Nokogiri или Hpricot . У обоих есть свои сильные и слабые стороны. Выбор языка и пакета действительно сводится к тому, что вы хотите делать с данными после их анализа.

1
ответ дан 4 December 2019 в 06:05
поделиться