2011-04-25 103 views
6

我有一个具有各种html标签的html格式的字符串。我想把这个字符串放在xml标签中,这样html标签就会保留下来。例如将html标签存储在xml

public class XMLfunctions { 

    public final static Document XMLfromString(String xml){ 

     Document doc = null; 

     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
       try { 

      DocumentBuilder db = dbf.newDocumentBuilder(); 

      InputSource is = new InputSource(); 
      is.setCharacterStream(new StringReader(xml)); 
      doc = db.parse(is); 

     } catch (ParserConfigurationException e) { 
      System.out.println("XML parse error: " + e.getMessage()); 
      return null; 
     } catch (SAXException e) { 
      System.out.println("Wrong XML file structure: " + e.getMessage()); 
         return null; 
     } catch (IOException e) { 
      System.out.println("I/O exeption: " + e.getMessage()); 
      return null; 
     } 

      return doc; 

    } 


    /** Returns element value 
     * @param elem element (it is XML tag) 
     * @return Element value otherwise empty String 
     */ 
    public final static String getElementValue(Node elem) { 
     Node kid; 
     if(elem != null){ 
      if (elem.hasChildNodes()){ 
       for(kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling()){ 
        if(kid.getNodeType() == Node.TEXT_NODE ){ 
         return kid.getNodeValue(); 
        } 
       } 
      } 
     } 
     return ""; 
    } 

    /*Start Parsing Body */ 
    public static String getBodyXML(String id){  
      String line = null; 
      try { 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost("http://192.168.1.44:9090/solr/core0/select/?q=content_id:"+id+"&version=2.2&start=0&rows=10&indent=on"); 
       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       line = EntityUtils.toString(httpEntity); 

      } catch (UnsupportedEncodingException e) { 
       line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; 
      } catch (MalformedURLException e) { 
       line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; 
      } catch (IOException e) { 
       line = "<results status=\"error\"><msg>Can't connect to server</msg></results>"; 
      } 
      String st= ParseXMLBodyNode(line,"doc"); 
      return st; 

    } 

    public static String ParseXMLBodyNode(String str,String node){ 
     String xmlRecords = str; 
     String results = ""; 
     String[] result = new String [1]; 
     StringBuffer sb = new StringBuffer(); 
     StringBuffer text = new StringBuffer(); 
     try { 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder db = dbf.newDocumentBuilder(); 
      InputSource is = new InputSource(); 
      is.setCharacterStream(new StringReader(xmlRecords)); 
      Document doc = db.parse(is); 
      NodeList indiatimes1 = doc.getElementsByTagName(node); 
      sb.append("<results count="); 
      sb.append("\"1\""); 
      sb.append(">\r\n"); 

      for (int i = 0; i < indiatimes1.getLength(); i++) { 
       Node node1 = indiatimes1.item(i); 
       if (node1.getNodeType() == Node.ELEMENT_NODE) { 
        Element element = (Element) node1; 
        NodeList nodelist = element.getElementsByTagName("str"); 
        Element element1 = (Element) nodelist.item(0); 
        NodeList title = element1.getChildNodes(); 
        title.getLength(); 
        for(int j=0; j<title.getLength();j++){ 
         text.append(title.item(j).getNodeValue()); 
        } 
        System.out.print((title.item(0)).getNodeValue()); 
        sb.append("<result>\r\n"); 
         sb.append("<body>"); 
         String tmpText = html2text(text.toString()); 
          sb.append("<![CDATA[<body>"); 
          sb.append(tmpText); 
          sb.append("</body>]]>"); 
         sb.append("</body>\r\n"); 
        sb.append("</result>\r\n"); 
        result[i] = title.item(0).getNodeValue(); 
       } 
      } 
      sb.append("</results>"); 
     } catch (Exception e) { 
      System.out.println("Exception........"+results); 
      e.printStackTrace(); 
     } 
     return sb.toString(); 
    } 
    /*End Parsing Body*/ 


    public static int numResults(Document doc){  
     Node results = doc.getDocumentElement(); 
     int res = -1; 
     try{ 
      res = Integer.valueOf(results.getAttributes().getNamedItem("count").getNodeValue()); 
     }catch(Exception e){ 
      res = -1; 
     } 
     return res; 
    } 

    public static String getValue(Element item, String str) {  
     NodeList n = item.getElementsByTagName(str);   
     return XMLfunctions.getElementValue(n.item(0)); 
    } 


    public static String html2text(String html) { 

     String pText = Jsoup.clean(html, Whitelist.basic()); 
     return pText; 
    } 

} 

我把这些功能就像

String xml = XMLfunctions.getBodyXML(id); 

Document doc = XMLfunctions.XMLfromString(xml); 

我想,字体标签是像在XML html标记。

帮助将不胜感激!!!!!

回答

11

附上您的HTML在CDATA section所以它不会当作你的XML的一部分,而只是普通的文本:

<result> 
<![CDATA[ 
    <body><font size="2px" face="arial">Hello World</font></body> 
]]> 
</result> 

更新

你的问题很可能是在这里:

sb.append("<result>\r\n"); 
    sb.append("<body>"); 
    String tmpText = html2text(text.toString()); 
     sb.append("<![CDATA[<body>"); 
     sb.append(tmpText); 
     sb.append("</body>]]>"); 
    sb.append("</body>\r\n"); 
sb.append("</result>\r\n"); 

请注意sb.append("<body>");sb.append("</body>\r\n");围绕y我们的CDATA部分,它们可能会导致您的XML无法正确读取的问题。也许你应该删除这两条线,所以它看起来是这样的:

sb.append("<result>\r\n"); 
    String tmpText = html2text(text.toString()); 
    sb.append("<![CDATA[<body>"); 
    sb.append(tmpText); 
    sb.append("</body>]]>"); 
sb.append("</result>\r\n"); 
+0

@BoltClock:应该是这样 sb.append( “<![CDATA [”); sb.append(tmpText); sb.append(“]]>”); 或别的东西 – ReNa 2011-04-25 10:30:43

+0

我不明白。你是用'StringBuilder'来构建XML吗? – BoltClock 2011-04-25 10:37:42

+0

@BoltClock:首先我解析一个xml,然后使用jsoup basic()方法,我将所有的格式保存在一个字符串中,然后我追加那个字符串StringBuffer,这是我在先前的注释中提出的方法,并创建一个xml,然后再次xml解析。此时,即使使用了cdata,我也没有收到任何东西。 – ReNa 2011-04-25 10:56:05