2011-03-20 72 views
0

我正在嘗試使用XPath和Android解析簡單的SIP消息。其中一條消息在this document中描述。使用XPath解析簡單的SIP消息android

實際的消息是這樣的:

<isComposing xmlns='urn:ietf:params:xml:ns:imiscomposing' 
      xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> 
    <state>active </state> 
    <contenttype> text/html </contenttype> 
    <refresh>60</refresh> 
</isComposing> 

我有這個代碼塊從SIP請求得到消息,並試圖解析它,以便找到狀態,

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
    domFactory.setNamespaceAware(false); // never forget this! THIS WAS TRUE ORIGINALLY CHANGED BY MAXSAP 
    DocumentBuilder builder; 
    try { 
     builder = domFactory.newDocumentBuilder(); 
     Log.e("IMHandler","<onTransRequest> parsing body:: "+ req.getBody()); 
     Document doc = builder.parse(req.getBody()); 

     XPathFactory factory = XPathFactory.newInstance(); 
     XPath xpath = factory.newXPath(); 
     XPathExpression expr= xpath.compile("//isComposing/state/text()"); 

     Object result = expr.evaluate(doc, XPathConstants.NODESET); 
     NodeList nodes = (NodeList) result; 
     for (int i = 0; i < nodes.getLength(); i++) { 
      Log.e("IMHandler"," <onTransRequest> *************** PARSING ***********"); 
      Log.e("IMHandler"," <onTransRequest> NodeValue"+nodes.item(i).getNodeValue()); 
      Log.e("IMHandler"," <onTransRequest> *************** /PARSING ***********"); 
     } 

    } catch (ParserConfigurationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (XPathExpressionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

但在這一行builder.parse(req.getBody());我得到錯誤:

03-20 20:03:44.637: WARN/System.err(4150): java.net.MalformedURLException: Protocol not found: <SPAN STYLE="FONT-FAMILY:Arial; FONT-SIZE:10pt ">dfg</SPAN> 
03-20 20:03:44.637: WARN/System.err(4150):  at java.net.URL.<init>(URL.java:275) 
03-20 20:03:44.637: WARN/System.err(4150):  at java.net.URL.<init>(URL.java:159) 
03-20 20:03:44.637: WARN/System.err(4150):  at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:120) 
03-20 20:03:44.637: WARN/System.err(4150):  at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:158) 
03-20 20:03:44.637: WARN/System.err(4150):  at org.sipdroid.sipua.ui.IMHandler.onTransRequest(IMHandler.java:239) 
03-20 20:03:44.637: WARN/System.err(4150):  at org.zoolu.sip.transaction.TransactionServer.onReceivedMessage(TransactionServer.java:148) 
03-20 20:03:44.637: WARN/System.err(4150):  at org.zoolu.sip.provider.SipProvider.processReceivedMessage(SipProvider.java:1091) 
03-20 20:03:44.637: WARN/System.err(4150):  at org.zoolu.sip.provider.SipProvider.onReceivedMessage(SipProvider.java:1203) 
03-20 20:03:44.637: WARN/System.err(4150):  at org.zoolu.sip.provider.UdpTransport.onReceivedPacket(UdpTransport.java:117) 
03-20 20:03:44.637: WARN/System.err(4150):  at org.zoolu.net.UdpProvider.run(UdpProvider.java:189) 

有沒有人遇到同樣的錯誤?我是使用XPath的新手,也注意到我已經更改了名稱空間,希望這是一個名稱空間問題,但沒有運氣。

+0

我認爲問題不在XPath中。什麼是'req'?顯示一些與'req'變量相關的代碼。 – Olegas 2011-03-20 19:35:10

+0

需求是mjsip消息對象。 Thid是一個ontransaction請求方法,req是該請求的sip消息。問候maxsap – maxsap 2011-03-20 22:48:33

回答

0

雖然req.getBody被處理以創建流(?)來解析,但是一些URL交互正在發生。您的代碼使用格式不正確的網址。

兩次檢查URL是否用於創建req對象是正確組成的。

編輯:

方法DocumentBuilder.parse(字符串)是解析從指定的URL的文檔。然後,getBody()方法返回StringDocumentBuilder嘗試將其解釋爲字符串URL。您需要使用parse(InputStream)parse(File)

編輯: 您需要爲XPath操作指定命名空間上下文。嘗試在評估表達式之前添加這些行。

xpath.setNamespaceContext(new NamespaceContext() { 
     public String getNamespaceURI(String s) { 
      if (s.equals(XMLConstants.DEFAULT_NS_PREFIX)) 
       return doc.lookupNamespaceURI(null); 
      else 
       return doc.lookupNamespaceURI(s); 
     } 

     public String getPrefix(String s) { 
      return doc.lookupPrefix(s); 
     } 

     public Iterator getPrefixes(String s) { 
      return null; 
     } 
    }); 
+0

嗨Olegas,從我的理解你說我正在使用getBody方法,而正在發生某種類型的處理?但是這個方法返回一個普通的字符串有什麼樣的處理呢? – maxsap 2011-03-20 21:11:51

+0

@maxsap我編輯了我的答案 – Olegas 2011-03-21 08:00:00

+0

@ Olegas,非常感謝,我改變了getMessage方法:InputStream is = new ByteArrayInputStream(req.getBody()。getBytes());並且工作正常,知道我必須找到正確的XPath語句才能正確解析文檔。 – maxsap 2011-03-21 18:00:21