2011-02-10 54 views
0

已经有许多问题已经问如何编写XML解析器,主要用于网站或其它应用程序..技术用于在JavaScript编写XML解析器

也有证明是有益的,包括其他教程:

http://www.switchonthecode.com/tutorials/xml-parsing-with-jquery

不过,我试图写的文件格式SBML解析器(系统生物学标记语言):

规格 - http://sbml.org/Documents/Specifications

我一直在尝试对解析器进行硬编码,而对于我的情况,它不适用于每个部分。

$(document).ready(function() 
    { 
    //alert("In function"); 
     $.ajax({ 
     type: "GET", 
     url: "sbml.xml", 
     dataType: "xml", 
     success: parseXml 

     }); 

    }); 

    function parseXml(xml) { 
     //alert("Xml loaded"); 
     $("#output").append("Output loaded <br />"); 
     $(xml).find("model").each(function() { 

      $("#output").append("Found model <br />"); 
      //alert("Found model"); 
      //alert($(this).attr("id")); 
      $(xml).find("listOfCompartments").each(function() { 
       //alert("Found list of compartments"); 
       $("#output").append("List of Compartments found <br />"); 
       $.each($(this).children(), function() { 
        var id = $(this).attr("id"); 
        var size = $(this).attr("size"); 
        //alert("Id: " + id + ", Size: " + size); 
        $("#output").append("Compartment <br />"); 
        $("#output").append("Id: " + id + ", Size: " + size + "<br />"); 
       }); 
      }); 

     }); 
    } 

由于规范是相当大的(8页),是容易发生变化的,有没有更好的方式来写这样的情况下,解析器?

是否有可能制作所有可能节点的数组并循环遍历,而不是硬编码所有内容。这会更有效率吗?

回答

1

除非没有其他选择,否则不要编写XML解析器。 XML规范中有许多事情(例如参数实体,内部子集等),您必须解决并且涉及很多。对于所有语言总是有优秀的解析器,您应该使用其中的一种。

如果你自己写,你会写一个解析器,只实现部分规范。它肯定会在未来破裂,这只会给你和你的合作者带来问题。

更新: 区分PARSING和操作DOM。你不想解析XML,你想让浏览器为你做(它会)。你想操纵DOM,也许用XPath。

更新: 我不是专家,但这里是MS环境中解析器的一个相当新近的例子。

XML Parser in Microsoft Browser: 
Microsoft’s XML parser is a COM component that comes with Internet Explorer 5 and higher. To load the XML Parser in JavaScript will have to follow series of steps. 

    1. Create instance of XML Parser: 

    <script type="text/javascript"> 
     var xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
    </script> 

    This will load the xml parser in the memory and will wait for the xml document. This component will automatically get erased when you close the browser window or the Browser. Here the xmlDoc holds the XML Object for JavaScript. 

其他浏览器将具有类似的解析器。

UPDATE3: “您是否为CML创建了解析器...”?不是真的。我于1997年参与了XML及其解析器的开发(Norbert Mikula,Tim Bary等)。事实上,我们重新设计了XML,这是由于解析XML的困难所致。

XML解析器创建SAX事件流或DOM,理论上所有解析器都应创建相同的解析器。这被称为Infoset。它删除了XML中的所有语法变体(引用,CDATA,实体等)。它通常被称为DOM。

我想你的意思是 - “如何将信息集变成专门用于我的应用程序的东西”?如果是这样,是的 - 我已经编写了大量代码来操作原始信息集。就我而言,它是创建XML Elements的专用子类。因此,我有CMLMolecule,CMLAtom等。代码是JUMBO(CMLXOM)https://bitbucket.org/wwmm/cmlxom

这与MathML和SVG(已说明)采用的原理相同 - 它们有专门的子类。

这是相当多的工作 - 我使用了自动和手工制作的方法。我不喜欢W3CDom作为基础,我建议你可以在Element中继承DOM。但是,如果您打算编写最终的SBML Javascript DOM,那么我不会阻止您。

我在前段时间为JavaScript中的CML做了这个,但浏览器有片状的DOM,我可能需要重新访问它。做交互式图形几乎是必不可少的。

期待您

+0

在其他语言中有许多解析器,例如java和python,但似乎没有用于制作Web应用程序的客户端脚本端(我不想制作java servlet)。它是否在你的研究领域? – Sycren 2011-02-10 17:26:22

+0

在这种情况下,我不认为我希望浏览器为我做这件事,我希望让应用程序接受多个sbml文件,而不仅仅是一般情况。当你设计CML时,你是否也为它创建了一个解析器?你介意我发给你一封电子邮件吗? – Sycren 2011-02-10 19:17:33

1

听觉浏览器可以解析XML让它为你做它。浏览器XML解析可能是正确的,然后你只需要与dom一起工作。