【问题标题】:Get only txt from an XML document from java?从 java 的 XML 文档中只获取 txt?
【发布时间】:2017-02-07 11:27:16
【问题描述】:

早上好,例如,你怎么能从这个 xml 项(描述)中只获取 txt?

<description><![CDATA[<b>
<font color="#000000">hello world...</font>
</b>]]></description>

我现在的代码是

if (cureent.getNodeName().equalsIgnoreCase("description")){
item.setDescription(cureent.getTextContent());

打印的结果是:

<![CDATA[<b><font color="#000000">hello world...</font></b>]]>

这就是我需要打印的内容:

hello world...

谢谢大家

【问题讨论】:

    标签: java xml parsing


    【解决方案1】:

    由于您的输入文件不是格式良好的 XML,因此我们不能使用 DocumentBuilder 类将其解析为 XML。 因此,我们需要通过将其处理为纯文本文件来破解它。 这是我尝试过的:

        BufferedReader br = null;
        FileReader fr = null;
    
        try {
    
            fr = new FileReader("D:\\workspace\\Test\\Trial.xml"); // Put your text here
            br = new BufferedReader(fr);
    
            String sCurrentLine;
            StringBuffer totalString = new StringBuffer();
    
            while ((sCurrentLine = br.readLine()) != null) {
                totalString.append(sCurrentLine);
            }
    
            String condensedString = totalString.substring(totalString.indexOf("<font color="),
                    totalString.indexOf("</font>"));
    
            String moreCondensedString = condensedString.replaceAll("[0-9]", "").replaceAll("#", "");
            System.out.println(moreCondensedString.substring(moreCondensedString.indexOf('>') + 1));
        } catch (IOException e) {
    
            e.printStackTrace();
    
        } 
    

    在这里,我首先通过从&lt;font color=&lt;/font&gt; 标记中剪切您的字符串来压缩它。

    然后我把所有的numbersspecial characters都换掉了

    然后我又把字符串从'&gt;'剪下来压缩了

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      试试这个

      if (cureent.getNodeName().equalsIgnoreCase("description")){
      item.setDescription(cureent.getTextContent().replaceAll("<.*?>", ""););
      

      【讨论】:

        【解决方案3】:

        我想出了一个使用 Jsoup 的解决方案,它适用于您的示例输入。不过建议使用广泛的输入进行测试。

        public static void main(String[] args) throws Exception {
            String xml = "<description><![CDATA[<b>\r\n" + 
                    "<font color=\"#000000\">hello world...</font>\r\n" + 
                    "</b>]]></description>";
            Document d = Jsoup.parse(xml);
            String text = extractText(d.getElementsByTag("description").get(0).text());
            System.out.println(text);
        
        }
        
        private static String extractText(String xml) {
            Document d = Jsoup.parse(xml);
            d = Jsoup.parse(xml);
            if(!xml.equals(d.text())){
                return extractText(d.text());
            }
            return d.text();
        }
        

        【讨论】:

          【解决方案4】:

          可能有一个您可以使用的解析器,但我认为一个简单的正则表达式应该可以完成工作:

          String textContent = cureent.getTextContent();
          String stripped = textContent.replaceAll("^<!\\[CDATA\\[|\\]\\]>$|<[^>]*>","");
          item.setDescription(stripped);
          

          以下是上面使用的模式的细分:

                      "^<!\\[CDATA\\[" // find "<![CDATA[" at beginning
                      +"|"             // or 
                      +"\\]\\]>$"      // find "]]>" at ending
                      +"|"             // or
                      +"<[^>]*>"      // every tag from "<" up to ">" 
          

          当然,正如评论者提醒我们的那样,如果您有嵌套标签,上述简单的正则表达式将失败,即“>”出现在某个实际上并没有关闭标签的地方。如果这种类型的数据是可能的,最好使用真正的解析器,例如汤。

          【讨论】:

          • @Mark Here 是当有人回答您的问题时该怎么做。要将答案标记为已接受,请单击答案旁边的复选标记以将其从灰色切换为已填充。无需对您的问题或答案添加评论以说“谢谢”。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多