用于解析xml的正则表达式问题

时间:2011-08-10 01:04:56

标签: java html xml regex htmlunit

我正在尝试在标记<dev>Text Here</dev>

之间插入文本
<div id="tt" class="info">
  Text Here
</div>
Output: Text Here

如何在java中使用正则表达式实现此目的?感谢。

修改

我正在使用HtmlUnit

 currentPage.getElementById("tt").asXml();
 currentPage.getElementById("tt").asText(); // returns ""

5 个答案:

答案 0 :(得分:5)

别。使用正确的解析器并且只是拉出你感兴趣的元素要容易得多。使用正则表达式非常困难。

答案 1 :(得分:2)

永远不要尝试使用正则表达式解析XML或HTML。

  1. 这在理论上是不可能的:XML和HTML的语法是一种比正则表达式可以处理的语法更丰富的语法。

  2. 无论如何,你会弄错,原因与理论上的限制无关:你需要考虑太多的细微差别,如空白,CDATA部分,评论等。

  3. 并不缺少免费的现成解析器,可以正常,快速地完成工作。

答案 2 :(得分:1)

如果是HTML,你试图解析或尝试Jsoup,http://watchitlater.com/blog/2010/09/jsoup-beautifulsoup-for-java/

答案 3 :(得分:1)

你可以使用正则表达式,只要你不介意完全按照你说的做(也可能不是你的意思):

在字符串上尝试regexp <div.*>(.*)</div>

<div id="tt" class="info">
    <a href="../link.htm>Clicky</a>
</div>

您将获得值<a href="../link.htm>Clicky</a>,而不是您想要的值Clicky。由于XML可以无限制地嵌套,因此正则表达式无法与它们匹配,除非您做出某些牺牲(例如您想要容纳的每个级别的手动编码)。

答案 4 :(得分:1)

使用正则表达式,您可以使用以下内容:

String s = "<div id=\"tt\" class=\"info\">\n  Text Here   \n</div>";
System.out.println(s);
Pattern p = Pattern.compile("<div id=\"tt\" class=\"info\">\\s*([^<]+?)\\s*</div>", Pattern.DOTALL);
Matcher m = p.matcher(s);
if (m.find()) {
    System.out.println(m.group(1));  // Text Here
}

但是,更好的解决方案是使用JTidy将HTML解析为XHTML,然后使用XPath//div[@id = 'tt']/text())提取所需的文本。这些方面的东西:

public static void main(String[] args) throws Exception {
    // Create a new JTidy instance and set options
    Tidy tidy = new Tidy();
    tidy.setXHTML(true); 

    // Parse an HTML page into a DOM document
    URL url = new URL("http://something.com/something.html");       
    Document doc = tidy.parseDOM(url.openStream(), System.out);

    // Use XPath to obtain whatever you want from the (X)HTML
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression expr = xpath.compile("//div[@id = 'tt']/text()");
    String text = (String)expr.evaluate(doc, XPathConstants.STRING);
    System.out.println(text); // Text Here
}