2011-02-10 34 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一起工作。