На каком языке проще всего работать с XML-контентом? - PullRequest
18 голосов
/ 19 ноября 2008

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

Ответы [ 8 ]

18 голосов
/ 19 ноября 2008

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

Действительно, с небольшим умом вы можете иметь ваши «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's 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

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

8 голосов
/ 19 ноября 2008

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

6 голосов
/ 19 ноября 2008

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

LINQ to XML Overview

4 голосов
/ 19 ноября 2008

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

4 голосов
/ 19 ноября 2008

Я добавлю предложение для 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 , которая может помочь, а также документация .

2 голосов
/ 29 ноября 2008

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

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

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

2 голосов
/ 29 ноября 2008

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

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

2 голосов
/ 19 ноября 2008

C # или VB.Net с использованием LiNQ to XML. LiNQ to XML очень мощный и простой в реализации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...