使用XML内容哪种语言最简单,最快速?

时间:2008-11-19 10:35:19

标签: java .net python xml ruby

我们的开发人员拥有这些语言的知识 - Ruby,Python,.Net或Java。我们正在开发一个主要处理XML文档的应用程序。大部分工作是将预定义的XML文件转换为数据库表,通过数据库提供XML文档之间的映射,从数据库创建报告等。哪种语言最简单,最快速? (这是一个网络应用程序)

9 个答案:

答案 0 :(得分:18)

动态语言规则。为什么?映射很容易编码和更改。您不必重新编译和重建。

实际上,只要有点聪明,就可以将“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

要进行更改,您可以更正构建器或创建新构建器。您可以调整加载程序源以标识将使用的构建器。您可以毫不费力地选择构建器作为命令行参数。动态语言中的动态导入对我来说似乎有些过分,但它们很方便。

答案 1 :(得分:8)

XSLT

我建议根据需要使用XSLT templates将XML转换为INSERT语句(或任何您需要的语句)。
您应该可以从您提到的任何语言调用XSLT。

这将导致代码比在长时间内完成的代码少得多。

答案 2 :(得分:6)

在.NET中,C#3.0和VB9为使用LINQ to XML处理XML提供了出色的支持:

LINQ to XML Overview

答案 3 :(得分:4)

我会提出一个流行的Ruby XML解析器Hpricot的建议(虽然有很多类似的选项)。

示例:

给出以下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应用程序,您可以快速构建您需要的原型,您可以直接与您选择的数据库进行交互,然后您可以根据需要输出数据

这是parsing XML with Hpricot的另一个很棒的资源页面,可能对documentation有帮助。

答案 4 :(得分:4)

为了快速周转,我发现Groovy非常有用。

答案 5 :(得分:2)

使用LiNQ到XML的C#或VB.Net。 LiNQ to XML非常强大且易于实现

答案 6 :(得分:2)

一个有趣的解决方案可能是Ruby。 只需使用XML-&gt; Object映射器,然后使用对象关系映射器(ORM)将其放入数据库中。 我不得不用ruby做一个关于XML Mapping的简短讨论,你可以看一下幻灯片,看看你最喜欢什么:http://www.marc-seeger.de/2008/11/25/ruby-xml-mapping/

至于ORM:Active Record或Datamapper应该是要走的路

答案 7 :(得分:2)

ECMAScript使用E4X(“ECMAScript for XML”)很好地处理XML。这可以在Adobe最新版本的ActionScript版本3中看到。我相信JavaScript 2(我认为将与Firefox 4一起发布)也将支持E4X。

不确定独立JavaScript解释器(即Rhino等)对此的支持,这对我来说最重要的是......但如果它对你来说很好,你总能找到他们的支持对它(并报告给我们: - ))。

有关简单示例,请参阅http://en.wikipedia.org/wiki/E4X#Example

答案 8 :(得分:0)

如果您精通Java,可以尝试VTD XML解析器来解析大量XML数据。