2011-03-20 5 views
0

XPath 및 Android를 사용하여 간단한 SIP 메시지를 구문 분석하려고합니다. 이 메시지 중 하나는 this document에 설명되어 있습니다.android에서 XPath로 간단한 SIP 메시지 구문 분석

실제 메시지는 다음과 같습니다

<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

+0

Req는 mjsip 메시지 개체입니다. Thid는 트랜잭션 요청 방법이고 req는 요청의 메시지입니다. 감사합니다 maxsap – maxsap

답변

0

req.getBody은 처리 할 스트림 (?)을 처리하는 동안 일부 URL 상호 작용이 발생합니다. 조작 된 URL을 사용하여 코드를 작성했습니다.

req 개체를 만드는 데 URL이 사용되는지 2 회 확인하면 올바르게 구성됩니다.

편집 :

이 방법의 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

+0

@maxsap 내 답변을 편집했습니다 – Olegas

+0

@Olegas, 고마워, 이걸로 getMessage 메서드를 변경했습니다 : InputStream = new ByteArrayInputStream (req.getBody(). getBytes()); 잘 작동하고, 문서를 올바르게 구문 분석하기 위해 올바른 XPath 문을 찾아야한다는 것을 알고 있어야합니다. – maxsap

관련 문제