Разбор простых sip-сообщений с XPath на Android - PullRequest
0 голосов
/ 20 марта 2011

Я пытаюсь разобрать простые SIP-сообщения, используя XPath и 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, также обратите внимание, что я изменил предупреждения пространства имен, надеясь, что это проблема пространства имен, но не повезло.

1 Ответ

0 голосов
/ 20 марта 2011

Пока req.getBody обрабатывается для создания потока (?) Для анализа, происходит некоторое взаимодействие URL. Ваш код используется с использованием некорректного URL.

Дважды проверьте, что URL-адрес, используемый для создания req объекта, правильно сформирован.

EDIT:

Метод DocumentBuilder.parse (String) анализирует документ с указанного URL-адреса. Затем метод getBody(), возвращающий String и DocumentBuilder, пытается интерпретировать его как строковый URL. Вам нужно использовать parse (InputStream) или parse (File) в вашем случае.

EDIT: Вам необходимо указать контекст пространства имен для вашей операции 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;
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...