簡體   English   中英

以流方式從Java解析XML的更通用方法?

[英]More generic way to parse XML from Java in a streaming fashion?

我需要有效地解析可能非常大的XML文件(因此無法將整個文件放入內存中)。 因此,我研究了XMLStreamReader之類的流技術,但是這些技術看起來很底層,並且會產生非常硬的代碼:

   event = parser.next();
   switch (event)
   {
    case XMLStreamConstants.START_ELEMENT:
         elementName = parser.getLocalName();
         if (elementName.equals("name")){
             state = FOUND_A_NAME;
         }else if (elementName.equals("address")){
             state = FOUND_AN_ADDRESS;                      
         }
    ETC...
    }

我正在尋找一種方法,而不將解析器與要解析的內容緊密耦合,此外,此代碼感覺不對。 看來這應該更真正地面向事件。

有什么建議嗎?

SAX的事件可以完全按照您的想法執行。.:) http://www.saxproject.org/quickstart.html演示了一個簡單的代碼庫。 我想念什么嗎?

如果您正在尋找用於以流模式處理XML的高級語言,並且不介意處於最新狀態,請考慮Saxon-EE 9.3 XSLT中的流功能-XSLT 3.0草案的部分實現規格。

http://www.saxonica.com/documentation/sourcedocs/streaming.xml

這可以寫成通用的。 例如,我有一個屬性文件,該文件在xml元素名稱和類字段名稱/哈希映射鍵名稱之間進行了映射。

if (event.isStartElement()) {
 if  (event.asStartElement().getName().getLocalPart().equals(XMLElementName)) {

    event = eventReader.nextEvent();
    fields.put(classFieldName, event.asCharacters().getData());
        continue;
 }
}

這有助於我們擁有一個解析器來解析不同的xml消息。 這只是一個想法..我們可以做更多..

我認為代碼的緊密耦合本質與StAX無關,這只是您選擇編寫代碼的方式。

您可以使用查找表(例如,將元素名稱添加到處理程序對象)輕松地重構該代碼,以將事件的處理委派給處理程序對象。 這種機制是完全通用和可重用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM