2012-12-30 117 views
0

我用XmlPullParser解析Xml。我只想處理Xml標記和其中包含的文本,然而,XmlPullParser讀取標記之間的空白文本(空格和回車)。可以設置爲忽略這個空白嗎?使XmlPullParser忽略空白?

回答

1

我沒有用之前XmlPullParser(所以道歉,如果這是完全錯誤的),但具有的javadoc一眼,好像當你調用nextToken()你必須看的返回值,並跳過IGNORABLE_WHITESPACE

以下是不合適的(謝謝Jeff): 順便說一句你是被迫使用XmlPullParser?根據你想要達到的 聽起來,我會考慮更高層次的API,如 Simple。我通常使用 JAXB,但這不是選擇哈哈。

+2

由於內存限制,他可能使用了pull語法分析器。我不確定您是否熟悉Android,但是使用完整的內存中AST解析大型XML文檔是不可能的 - 您必須使用pull解析來處理超過特定大小的任何內容。 –

+0

啊,好的,很高興知道! +1謝謝:) – phippsnatch

+0

真正的建議,他可以用XmlPullParser做些什麼,或者有更好的方法嗎?顯然,我習慣於處理服務器而不是手機哈哈:)樂趣! – phippsnatch

1

IDK是否存在忽略空白的設置。如果您將當前節點跟蹤爲字符串,則可以編碼以忽略空白。如果當前節點爲空,則忽略文本。我的測試顯示它只是逃脫了換行等。我圍繞它進行了如下優化。 危險該工程對XML我使用它可能無法正常工作對你的

String N=""; // Yes I know its Capitalized but its the Current Node and very important to keep track of. 


if (eventType == XmlPullParser.START_TAG) { 
    N = xpp.getName();//save the name of the node. 

... 

} else if (eventType == XmlPullParser.END_TAG) { 
    N = "";//clear the name of the node. 
} else if (eventType == XmlPullParser.TEXT) { 
    //if the name of the node is not blank then process it 
if (!N.equals("")) { 
     //I have a node so process it 
    } 

好運

0

尋找一個解決方案後,自己添加一個遲到的回答。

解析器有一個isWhiteSpace()方法。只能在與文字相關的事件類型上調用它(例如TEXT,CDSECT,IGNORABLE_WHITESPACE),否則會拋出。

您可以通過調用提升解析器的nextgetEventType來獲取事件類型。

調用next會自動跳過IGNORABLE_WHITESPACE事件。只有在調用nextToken時纔會觸發此事件類型,該類型更加細化,並且會觸及所有事件類型。儘管我們通過調用next來跳過「可忽略的」空白,但解析器仍然發現幾乎所有空白都不可檢索,因此需要您有權跳過它。

boolean isEoD = false; 

    do{ 
     switch (parser.next()){ 

      default: 
       break; 
      case XmlPullParser.TEXT: 

       if(!parser.isWhitespace()) //Throws if called on wrong eventType 
        System.out.println("Text: " + parser.getText()); 

       break; 
      case XmlPullParser.START_TAG: 
      case XmlPullParser.END_TAG: 
       System.out.println("TAG: " + parser.getName()+ "\n"); 
       break; 

      case XmlPullParser.END_DOCUMENT: 
       isEoD = true; 
     } 
    }while(!isEoD);