извлечение Java из строки - PullRequest
1 голос
/ 19 декабря 2011

У меня есть массив строк, похожих на

 <div id="option1">hello</div>
 <div style="color: cyan">world</div>

Есть ли способ, которым я могу извлечь информацию из div?Я уже что-то написал, но это не динамично (я должен указать длину бита), что бесполезно в моем приложении, потому что содержимое внутри массива ^ не всегда одинаково.

Надеюсь, вы понимаетемой вопрос, я отвечу как можно скорее, если вам нужна дополнительная информация.

Я использую Java.

Ответы [ 3 ]

3 голосов
/ 19 декабря 2011

Полный Jsoup пример:

List<String> res = new ArrayList<String>();
String[] html = new String[] { 
    "<div id=\"option1\">hello</div>",
    "<div style=\"color: cyan\">world</div>" };
for (String el : html) {
    String text = Jsoup.parse(el).text();
    res.add(text);
    System.out.println(text);
}

Вывод:

hello
world

Обратите внимание, что HTML из вашего примера является правильно сформированным XML и может быть проанализированиспользуя любой синтаксический анализатор XML.Вам понадобится специфический для HTML анализатор при работе с вводом, который не является правильно сформированным.

1 голос
/ 19 декабря 2011

Как сказал @SLaks, используйте анализатор HTML. Есть много хороших для Java. Мой любимый jSoup .

0 голосов
/ 20 декабря 2011

Если вы знаете, что будет только один набор тегов HTML, даже лучше, если бы вы знали, что это за тег, вы могли бы сделать что-то вроде:

String[] html = new String[] { 
    "<div id=\"option1\">hello</div>",
    "<div style=\"color: cyan\">world</div>" };

for(String index : html){
    int firstEnd = index.firstIndexOf("/>");
    int lastBeginning = index.indexOf("<", 2); // Could become "</div>

    String contents = index.substring(firstEnd + 1, lastBeginning - 1);
    System.out.println(contents);
}

Обратите внимание, что у меня нетЯ не тестировал этот код и не записывал его в IDE, поэтому он может быть не совсем корректным, но я думаю, вы можете видеть, откуда я.Просто получите строку между закрывающим «>» последнего тега перед информацией и открывающим «<» закрывающей части предыдущего тега ... </p>

Я также вижу, что-то вроде этого кодабыть модифицированным для обработки строк будет несколько тегов HTML с небольшим воображением ...

В качестве альтернативы, и я не могу поверить, что я не думал об этом, чтобы начать, вы могли бы использовать что-то вроде следующего.Хотя, опять же, он ограничен одним тегом HTML, хотя я уверен, что при необходимости вы могли бы придумать метод подсчета тегов *1009*.

String[] html = new String[] { 
                "<div id=\"option1\">hello</div>",
                "<div style=\"color: cyan\">world</div>" };

        String tag = "div";
        Pattern p = Pattern.compile("<" + tag + ".*?>(.*?)</" + tag + ">");
        Matcher m;

        for(String index : html){
            m = p.matcher(index);
            while(m.find()) System.out.println(m.group(1));
        }

HTH

...