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

Чтобы избежать возможных ошибок 'xargs: Argument list too long' из-за использования find ... | xargs ... при обработке десятков тысяч файлов, вы можете напрямую вывести вывод find на tar с помощью find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -
18
задан Varun Mahajan 19 November 2008 в 10:35
поделиться

8 ответов

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

Действительно, с небольшим умом, у Вас может быть свой "XPath XML к Тегу-> отображения" поля таблицы DB как непересекающиеся блоки кода Python, который импортирует Ваше главное приложение.

Блок кода Python является Вашим конфигурационным файлом. Это не .ini файл или a .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

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

19
ответ дан 30 November 2019 в 02:48
поделиться

XSLT

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

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

8
ответ дан 30 November 2019 в 02:48
поделиться

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

LINQ к обзору XML

6
ответ дан 30 November 2019 в 02:48
поделиться

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

4
ответ дан 30 November 2019 в 02:48
поделиться

Я брошу в предложении для 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

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

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

4
ответ дан 30 November 2019 в 02:48
поделиться

или C# или VB.Net использование LiNQ к XML. LiNQ к XML очень очень мощен и легок реализовать

2
ответ дан 30 November 2019 в 02:48
поделиться

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

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

2
ответ дан 30 November 2019 в 02:48
поделиться

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

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

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

2
ответ дан 30 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: