Подтвердить что ты не робот

Какой язык проще всего и быстрее работает с XML-контентом?

У нас есть разработчики со знанием этих языков - Ruby, Python,.Net или Java. Мы разрабатываем приложение, которое будет обрабатывать документы XML. Большая часть работы заключается в преобразовании предопределенных XML файлов в таблицы базы данных, обеспечении сопоставления между документами XML через базу данных, создании отчетов из базы данных и т.д. Какой язык будет самым простым и быстрым в работе? (Это веб-приложение)

4b9b3361

Ответ 1

Для этого используются динамические правила языка. Зачем? Отображения легко кодировать и изменять. Вам не нужно перекомпилировать и перестроить.

В самом деле, с небольшим количеством умений вы можете отображать "XML XPATH в тег → табличное поле БД" как непересекающиеся блоки кода Python, которые импортирует ваше основное приложение.

Блок кода Python является конфигурационным файлом. Это не файл .ini или .properties, который описывает конфигурацию. Это есть.

Мы используем Python, xml.etree и SQLAlchemy (чтобы отделить SQL от ваших программ), потому что мы работаем с минимальными усилиями и большой гибкостью.


source.py

"""A particular XML parser.  Formats change, so sometimes this changes, too."""

import xml.etree.ElementTree as xml

class SSXML_Source( object ):
    ns0= "urn:schemas-microsoft-com:office:spreadsheet"
    ns1= "urn:schemas-microsoft-com:office:excel"
    def __init__( self, aFileName, *sheets ):
        """Initialize a XML source.
        XXX - Create better sheet filtering here, in the constructor.
        @param aFileName: the file name.
        """
        super( SSXML_Source, self ).__init__( aFileName )
        self.log= logging.getLogger( "source.PCIX_XLS" )
        self.dom= etree.parse( aFileName ).getroot()
    def sheets( self ):
        for wb in self.dom.getiterator("{%s}Workbook" % ( self.ns0, ) ):
            for ws in wb.getiterator( "{%s}Worksheet" % ( self.ns0, ) ):
                yield ws
    def rows( self ):
        for s in self.sheets():
            print s.attrib["{%s}Name" % ( self.ns0, ) ]
            for t in s.getiterator( "{%s}Table" % ( self.ns0, ) ):
                for r in t.getiterator( "{%s}Row" % ( self.ns0, ) ):
                    # The XML may not be really useful.
                    # In some cases, you may have to convert to something useful
                    yield r

model.py

"""This is your target object.  
It part of the problem domain; it rarely changes.
"""
class MyTargetObject( object ):
    def __init__( self ):
        self.someAttr= ""
        self.anotherAttr= ""
        self.this= 0
        self.that= 3.14159
    def aMethod( self ):
        """etc."""
        pass

builder_today.py Одна из многих конфигураций сопоставления

"""One of many builders.  This changes all the time to fit
specific needs and situations.  The goal is to keep this
short and to-the-point so that it has the mapping and nothing
but the mapping.
"""

import model

class MyTargetBuilder( object ):
    def makeFromXML( self, element ):
        result= model.MyTargetObject()
        result.someAttr= element.findtext( "Some" )
        result.anotherAttr= element.findtext( "Another" )
        result.this= int( element.findtext( "This" ) )
        result.that= float( element.findtext( "that" ) )
        return result

loader.py

"""An application that maps from XML to the domain object
using a configurable "builder".
"""
import model
import source
import builder_1
import builder_2
import builder_today

# Configure this:  pick a builder is appropriate for the data:
b= builder_today.MyTargetBuilder()

s= source.SSXML_Source( sys.argv[1] )
for r in s.rows():
    data= b.makeFromXML( r )
    # ... persist data with a DB save or file write

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

Ответ 2

XSLT

Я предлагаю использовать XSLT templates, чтобы преобразовать XML в инструкции INSERT (или, что вам нужно), по мере необходимости.
Вы должны иметь возможность ссылаться на XSLT с любого из упомянутых вами языков.

Это приведет к намного меньшему количеству кода, чем к длинному раунду.

Ответ 3

В .NET, С# 3.0 и VB9 обеспечивают отличную поддержку для работы с XML с использованием LINQ to XML:

Обзор LINQ to XML

Ответ 4

Я брошу предложение Hpricot, популярный синтаксический анализатор Ruby XML (хотя есть много подобных опций).

Пример:

Учитывая следующий XML:

<Export>
  <Product>
    <SKU>403276</SKU>
    <ItemName>Trivet</ItemName>
    <CollectionNo>0</CollectionNo>
    <Pages>0</Pages>
  </Product>
</Export>

Вы просто разбираете:

FIELDS = %w[SKU ItemName CollectionNo Pages]

doc = Hpricot.parse(File.read("my.xml")) 
(doc/:product).each do |xml_product|
  product = Product.new
  for field in FIELDS
    product[field] = (xml_product/field.intern).first.innerHTML
  end
  product.save
end

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

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

Ответ 5

Для быстрого поворота я нашел Groovy очень полезным.

Ответ 6

либо С#, либо VB.Net, используя LiNQ для XML. LiNQ для XML очень мощный и простой в реализации

Ответ 7

Интересным решением может быть Ruby. Просто используйте XML- > Object mappers, а затем используйте объект-реляционный-mapper (ORM), чтобы поместить его в базу данных. Мне пришлось сделать короткий разговор по XML-сопоставлению с рубином, вы можете посмотреть слайды и посмотреть, что вам больше нравится: http://www.marc-seeger.de/2008/11/25/ruby-xml-mapping/

Что касается ORM: Active Record или Datamapper должен быть способ

Ответ 8

ECMAScript отлично обрабатывает XML с помощью E4X ( "ECMAScript for XML" ). Это можно увидеть в последней версии Adobe ActionScript, версия 3. Я считаю, что JavaScript 2 (будет выпущен с Firefox 4, я думаю) также поддержит E4X.

Не уверен насчет поддержки автономных интерпретаторов JavaScript (например, Rhino и др.), что важно для вас, я полагаю... Но если это выглядит хорошо, вы всегда можете найти поддержку за него (и сообщите нам: -)).

Для простого примера см. http://en.wikipedia.org/wiki/E4X#Example.