2010-01-12 3 views
2

다시 질문. 이번에는 서버에서받은 XML 메시지를 파싱합니다. 누군가가 현명하다고 생각하고 HTML 페이지를 XML 메시지에 삽입하기로 결정했습니다. 이제 HTML 페이지를이 XML 메시지에서 문자열로 추출하기 때문에 문제가 발생합니다. 당신은 Param1을에 HTML 페이지가 지정되어 있는지 볼Android : XML DOM 파서를 구문 분석합니다. 문자열을 자식 노드로 변환

<AmigoRequest> <From></From> <To></To> <MessageType>showMessage</MessageType> <Param0>general message</Param0> <Param1><html><head>test</head><body>Testhtml</body></html></Param1> </AmigoRequest>

:

확인이는 XML 내가 구문 분석있어 메시지입니다. 나는 다음과 같은 방법으로 메시지를 추출하려고 시도했다.

 
public String getParam1(Document d) { 
     if (d.getDocumentElement().getTagName().equals("AmigoRequest")) { 
      NodeList results = d.getElementsByTagName("Param1"); 
      // Messagetype depends on what message we are reading.   
      if (results.getLength() > 0 && results != null) {     
       return results.item(0).getFirstChild().getNodeValue(); 
      } 
     } 
     return ""; 
    } 

여기서 d는 문서 형식의 XML 메시지이다. getNodeValue()는 null을 반환하기 때문에 항상 null 값을 반환합니다. 나는 result.item (0) .getFirstChild(). hasChildNodes()를 시도 할 때 메시지에 태그가 있기 때문에 true를 반환합니다.

어떻게 문자열에서 Param0의 <html><head>test</head><body>Testhtml</body></html>이라는 html 메시지를 추출 할 수 있습니까?

저는 Android sdk 1.5 (거의 거의 자바)와 DOM Parser를 사용하고 있습니다.

시간과 답변을 보내 주셔서 감사합니다.

Antek

당신은 다음과 같이 PARAM1의 내용이 걸릴 수
+0

에 API 레벨을 변경해야 XPath는이 옵션하는지 간단한 변경을 함께했다? 그렇다면 나는 당신을 도울 수 있습니다. 그리고 나는 결코 물어 보지 않는 andriod를 사용하지 않았습니다. – ChadNC

+0

XPath는 지원되지 않지만 DOM4J와 Jaxen을 사용하여 Android에 대한 해결책을 찾을 수있었습니다. –

답변

1

:

당신이해야 할 모든 기능 구현하는 것입니다
public String getParam1(Document d) { 
     if (d.getDocumentElement().getTagName().equals("AmigoRequest")) { 
      NodeList results = d.getElementsByTagName("Param1"); 
      // Messagetype depends on what message we are reading.   
      if (results.getLength() > 0 && results != null) {     

       // String extractHTMLTags(String s) is a function that you have 
       // to implement in a way that will extract all the HTML tags inside a string. 
       return extractHTMLTags(results.item(0).getTextContent()); 
      } 
     } 
     return ""; 
    } 

:

String extractHTMLTags(String s) 

모든 HTML을 제거합니다 문자열에서 태그 어커런스. Remove HTML tags from a String

+0

안드로이드가 getTextContent 함수를 지원하지 않습니다. 안드로이드는 오래된 돔 파서를 사용하고 있습니다. 그러나 나는 어디에서 봐야할지 잘 알고있다. 여전히 주제에 대한 해결책을 찾지 못했지만 주제 제목을 편집했습니다. –

+1

'getTextContent'가 플랫폼에서 사용 가능하다면, 주위에'extractHTMLTags' 호출을 래핑하지 않고 호출하면 충분합니다. 'getTextContent'는 반환되는 문자열에서 XML 마크 업을 제거합니다 (더 정확히 말하면, 요소 태그를 남기고 중첩 된 요소 안에있는 모든 텍스트 문자열을 연결하여 값을 가져옵니다). 물론 HTML 내용 올바른 형식의 XML입니다. 그러나 그렇지 않은 경우 XML 구문 분석에서이 정도까지 얻을 수 없을 것입니다. –

+0

아, 안드로이드를 사용한 적이 없으며 DOM 파서에 대해 몰랐습니다! 나는 그것이 최신 버전을 사용하고 있다고 생각했다. 미안합니다! – Alex

0

편집 : 당신은이 게시물에서 살펴 수에 대한 나는 막 getTextContent() 안드로이드에서 지원되지 않는 이상 당신의 코멘트를 보았다. 다른 플랫폼에있는 사람에게 유용 할 경우를 대비하여이 답변을 남겨 둘 것입니다. 당신의 DOM의 API가 지원하는 경우에는 다음과 같이

, 당신은 getTextContent()를 호출 할 수 있습니다 : 그러나

public String getParam1(Document d) { 
     if (d.getDocumentElement().getTagName().equals("AmigoRequest")) { 
      NodeList results = d.getElementsByTagName("Param1"); 
      // Messagetype depends on what message we are reading.   
      if (results != null) {     
       return results.getTextContent(); 
      } 
     } 
     return ""; 
    } 

, getTextContent()는 DOM 레벨 3 API 호출입니다; 모든 파서가 그것을 보증 할 수있는 것은 아닙니다. Xerces-J does.

그러나 원래 예제에서는 null에 대한 확인이 잘못된 위치에 있습니다. 그것은해야한다 : results 정말 null로 돌아 오지 않을 경우

 if (results != null && results.getLength() > 0) {     

그렇지 않으면, 당신은 NPE를 얻을 것입니다.

0

getTextContent()을 사용할 수 없으므로 다른 옵션을 쓰는 것이 좋습니다. 어렵지 않습니다.사실, 당신이 이것을 독자적으로 쓰고 있거나 고용주가 오픈 소스에 대한 지나치게 엄격한 규칙을 갖고 있지 않다면, 시작 지점으로 Apache's implementation을 볼 수 있습니다; 610 ~ 646 행에는 필요한 것을 대부분 차지하는 것으로 보입니다. (. 아파치의 저작권 및 사용권을 존중하십시오)

그렇지 않으면, 방법에 대한 몇 가지 거친 의사 코드는 다음과 같습니다

String getTextContent(Node node) { 
    if (node has no children) 
     return ""; 

    if (node has 1 child) 
     return getTextContent(node.getFirstChild()); 

    return getTextContent(new StringBuffer()).toString(); 
} 

StringBuffer getTextContent(Node node, StringBuffer sb) { 
    for each child of node { 
     if (child is a text node) sb.append(child's text) 
     else getTextContent(child, sb); 
    } 
    return sb; 
} 
0

그럼 난 거의 코드로했다 ...

public String getParam1(Document d) { 
    if (d.getDocumentElement().getTagName().equals("AmigoRequest")) { 
     NodeList results = d.getElementsByTagName("Param1"); 
     // Messagetype depends on what message we are reading.   
     if (results.getLength() > 0 && results != null) {     
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db; 
      Element node = (Element) results.item(0); // get the value of Param1 
      Document doc2 = null; 
      try { 

       db = dbf.newDocumentBuilder(); 
       doc2 = db.newDocument(); //create new document 
       doc2.appendChild(doc2.importNode(node, true)); //import the <html>...</html> result in doc2 

      } catch (ParserConfigurationException e) { 
       // TODO Auto-generated catch block 
       Log.d(TAG, " Exception ", e); 
      } catch (DOMException e) { 
       // TODO: handle exception 
       Log.d(TAG, " Exception ", e); 
      } catch (Exception e) { 
       // TODO: handle exception 
       e.printStackTrace();    }    


      return doc2. .....// All I'm missing is something to convert a Document to a string. 
     } 
    } 
    return ""; 

} 

내 코드의 설명에 설명되어 있습니다. 제가 누락 된 것은 문서에서 문자열을 만드는 것입니다. 안드로이드에서 Transform 클래스를 사용할 수 없습니다 ... 객체의 직렬화를 doc2toString()이 제공합니다.

이 문제가 해결되면 내 다음 단계는 내 파서를 작성합니다.)

최고의 코드는 아니지만 temponary 솔루션입니다.

public String getParam1(String b) { 
     return b 
       .substring(b.indexOf("<Param1>") + "<Param1>".length(), b.indexOf("</Param1>")); 
    } 

여기서 b는 XML 문서 문자열입니다.

1

많이 확인하고 배의 머리 수천를 긁적 후 나는 8

관련 문제