0

已经有很多关于如何编写 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 页)并且容易更改,有没有更好的方法来为这种情况编写解析器?

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

4

2 回答 2

1

除非别无选择,否则不要编写 XML 解析器。XML 规范中有很多事情(例如参数实体、内部子集等),您必须处理这些事情并且参与其中。所有语言总是有优秀的解析器,你应该使用其中之一。

如果您自己编写它,您将编写一个仅实现部分规范的解析器。它肯定会在未来中断,只会给您和您的合作者带来问题。

更新:区分解析和操作 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,理论上所有解析器都应该创建相同的。这称为信息集。它删除了 XML 中的所有语法变化(引用、CDATA、实体等)。它通常被称为 DOM。

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

这与(比如说)MathML 和 SVG 所采用的理念相同——它们有专门的子类。

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

前段时间我确实在 Javascript 中为 CML 做过这个,但是浏览器的 DOM 很脆弱,我可能需要重新审视这个。这对于制作交互式图形几乎是必不可少的。

期待您的回音

于 2011-02-10T16:48:28.957 回答
1

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

于 2011-02-10T16:51:24.373 回答