【问题标题】:Which language is easiest and fastest to work with XML content?哪种语言最容易和最快地处理 XML 内容?
【发布时间】:2008-11-19 10:35:18
【问题描述】:

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

【问题讨论】:

  • 您使用的是什么数据库?您的数据库很可能支持原生 xml 处理。如果这样做,这可能是一个可行的选择。

标签: java .net python xml ruby


【解决方案1】:

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

确实,只要稍微聪明一点,您就可以将“XML XPATH to a Tag -> DB table-field”映射作为主应用程序导入的不相交的 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

要进行更改,您可以更正构建器或创建新构建器。您调整加载器源以确定将使用哪个构建器。您可以毫不费力地将 builder 的选择设为命令行参数。动态语言中的动态导入对我来说似乎有点矫枉过正,但它们很方便。

【讨论】:

  • 请详细解释一下
  • 我还想为 lxml 大声疾呼,它为 libxml2 提供 pythonic 绑定。除了构建 etree 之外,它还提供了比 elementtree 更完整的 xpath 支持。
  • + 1. 我在 C#、PHP、Java 和 Python 中尝试了 XML 处理,最后获胜。它只是更容易和更清晰。并且已经有工具可以自动完成大部分映射。
  • 您开始,“这是一种动态语言规则。为什么?映射很容易编码和更改。您不必重新编译和重建。”如果您在通常的 PL 意义上使用静态,您会将动态与解释混淆。
  • @ja:“将动态与解释混淆”?您必须就动态和解释之间的差异向我提供一些帮助。我不知道有什么区别。
【解决方案2】:

XSLT

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

这将导致比长期执行更少的代码。

【讨论】:

  • XSLT 无法工作,因为我们还必须在数据库中保存文件之间的映射
  • 您可以使用现有的(或您自己的)扩展函数或扩展元素来写入/更新数据库中的表行。例如,Saxon 有以下 7 种扩展元素:sql:connect、sql:query、sql:insert、sql:column、sql:update、sql:delete 和 sql:close
  • 我不同意。 XSLT 可以将 XML 转换为 XML,这在此处不必满足需要(至少不能转换为 SQL 语句)。无论如何,我发现 XSLT 难以使用:工具少、难以测试、难以调试、难以阅读,而且性能通常很低。
  • XSLT 可用于生成任何文本输出。输出不必是 XML。我也发现它很难使用:我不是每天都使用它,而且我很难理解它的工作方式。尽管如此,工具仍在改进,当我使用它时,与使用过程语言相比,我节省了大量时间。
【解决方案3】:

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

LINQ to XML Overview

【讨论】:

    【解决方案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 应用程序,您可以快速制作所需的原型,与您选择的数据库直接交互,并且可以根据需要输出数据。

    这是parsing XML with Hpricot 的另一个很棒的资源页面,它可能与documentation 一样有用。

    【讨论】:

      【解决方案5】:

      我发现Groovy 非常有用。

      【讨论】:

      • 值得指出的是,使用 groovy 意味着可以访问 Java 的 XML 解析库,尤其是它们的 XPath 支持,而无需使用 Java 实现的大量样板。
      • 过去我发现 Groovy 非常缓慢且资源匮乏
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

          不确定独立 JavaScript 解释器(即 Rhino 等)的支持,我想这对你来说是最重要的......但如果你觉得它不错,你可以随时查看他们的支持为此(并向我们报告:-))。

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

          【讨论】:

          • 是的,Javascript 可以是一个很好的答案。与 jQuery 结合使用会更好
          【解决方案9】:

          如果你精通 Java,可以试试VTD XML Parser 来解析大量的 XML 数据。

          【讨论】:

            猜你喜欢
            • 2013-03-24
            • 1970-01-01
            • 2013-11-25
            • 2011-03-16
            • 2013-11-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多