在javascript中编写xml解析器的技巧

时间:2011-02-10 16:43:51

标签: jquery xml xml-parsing

关于如何编写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页)并且容易发生变化,是否有更好的方法为这种情况编写解析器?

是否可以创建所有可能节点的数组并循环而不是硬编码所有内容。这会更有效吗?

2 个答案:

答案 0 :(得分: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元素的专用子类。因此我有CMLMolecule,CMLAtom等。代码是JUMBO(CMLXOM)https://bitbucket.org/wwmm/cmlxom

这与(例如)MathML和SVG所采用的哲学相同 - 它们具有专门的子类。

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

我之前在Javascript中为CML做过这个,但是浏览器有不稳定的DOM,我可能需要重新审视它。这对于进行交互式图形几乎是必不可少的。

期待收到你的回复

答案 1 :(得分:1)

浏览器可以解析XML,让它为您完成。浏览器XML解析可能是正确的, 然后你只需要使用dom。