jSoup获取HTML标签的值

3

我正在从互联网读取一个html文件,当我读取该文件时,控制台输出如下:

<string>
       <String1>
        text
       </String1>
       <level2>
        text2
       </level2>
       <level3>
        text3
       </level3>
       <level4>
        text4
       </level4>
       <level5>
         TEXT
       </level5>
</string>
<string>
           <String2>
            text
           </String2>
           <level2>
            text2
           </level2>
           <level3>
            text3
           </level3>
           <level4>
            text4
           </level4>
           <level5>
             THIS TEXT
           </level5>
    </string>

我怎样才能在第二个字符串中访问level5文本?我已经尝试了一整天都没有成功,真的希望有人能给我提供一些有用的建议。

以下是我的代码:

String line = null;

            try {
                // FileReader reads text files in the default encoding.
                FileReader fileReader = new FileReader(String.valueOf(doc));

                // Always wrap FileReader in BufferedReader.
                BufferedReader bufferedReader = new BufferedReader(fileReader);

                while ((line = bufferedReader.readLine()) != null) {
                    Elements tdElements = doc.getElementsByTag("level1");
                    for(Element element : tdElements )
                    {
                        //Print the value of the element
                        System.out.println(element.text());
                    }

                }

                // Always close files.
                bufferedReader.close();
            } catch (FileNotFoundException ex) {
                System.out.println(
                        "Unable to open file '" +
                                doc + "'");
            } catch (IOException ex) {
                System.out.println(
                        "Error reading file '"
                                + doc + "'");
                // Or we could just do this:
                // ex.printStackTrace();
            }
        }
//
        catch (IOException e) {
            e.printStackTrace();
        }

@JaredRummler 如果有两个选项,我该如何确保在选择level5之前满足条件(在option2标签下而不是option1标签下)?我已经更新了我的问题。 - dchamb
@JaredRummler 实际的 HTML 看起来像这个例子。但是那段代码导致应用程序崩溃了...你能再检查一下 HTML 吗?我已经更新了它。 - dchamb
3个回答

1

你可以在这里使用CSS选择器:

string:nth-of-type(2) > level5

演示: http://try.jsoup.org/~8w_pfCxDhJwIseTKiKsQjQJOBRs

描述

string:nth-of-type(2) /* Select the 2nd string node in document... */
> level5                /* ... then select all "level5" child nodes  */

示例代码

Document doc = ...
Element level5Node = doc.select("string:nth-of-type(2) > level5").first();
if (level5Node ==null) {
   throw new RuntimeException("Unable to locate level5 text...");
}

System.out.println(level5Node.text()); // THIS TEXT

1
以下代码使用JSoup解析您所提及的文本。变量“textToParse”是您提供的上述HTML代码。您可以使用JSoup的伪选择器来查找DOM树中特定位置的元素。希望这正是您想要的。
Document document = Jsoup.parse(textToParse);
Elements stringTags = document.select("string:eq(1)");
for(Element e : stringTags) {
    System.out.println(e.select("level5").text());
}

//Output: THIS TEXT

0

解决方案1:你的HTML是有效的XML:使用XML工具:

你可以使用XPath获取第二个level5: "//string[2]/level5"

解决方案2:使用Jsoup解析文档,然后像解决方案1一样使用XPath

查看Jsoup与XPath / XSoup:jsoup支持XPath吗?

解决方案1:

String xml="<root>"+your xml+"</root>";

DocumentBuilderFactory builderFactory =DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(xml)));
XPath xPath = XPathFactory.newInstance().newXPath();
String expression="//string[2]/level5";
String value = xPath.evaluate(expression, document);
System.out.println("EVALUATE:"+value);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接