Получить текст между двумя тегами с помощью метода substringBetween () объекта StringUtils - PullRequest
0 голосов
/ 23 октября 2018

У меня есть такой ввод:

<address>
    <addressLine>280 Flinders Mall</addressLine>
    <geoCodeGranularity>PROPERTY</geoCodeGranularity>
</address>
<address type="office">
    <addressLine>IT Park</addressLine>
    <geoCodeGranularity>office Space</geoCodeGranularity>
</address>

Я хочу захватить все, что находится между адресной меткой.

Я пытался:

File file = new File("test.html");
String testHtml = FileUtils.readFileToString(file); 
String title = StringUtils.substringBetween(testHtml, "<address>", "</address>");

Это не работает для всех случаев, потому что адресный тег может содержать некоторый атрибут внутри.Пожалуйста, помогите, как получить текст для такой строки.

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Как правило, вы должны , а не использовать регулярные выражения для анализа содержимого HTML / XML.Вместо этого используйте парсер как XPath.Учитывая, что вы, похоже, не можете использовать анализатор, мы можем попробовать следующую опцию с использованием сопоставителя шаблонов:

int count = 0;
String input = "<address>\n<addressLine>280 Flinders Mall</addressLine>\n    <geoCodeGranularity>PROPERTY</geoCodeGranularity>\n</address>\n<address type=\"office\">\n    <addressLine>IT Park</addressLine>\n    <geoCodeGranularity>office Space</geoCodeGranularity>\n</address>";
String pattern = "<address[^>]*>(.*?)</address>";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = r.matcher(input);

while (m.find( )) {
    count += m.group(1).length();
    System.out.println("Found value: " + m.group(1) );
}

System.out.println("count = " + count);  

Это находит счет 198 для двух тегов <address> в ваших данных образца.

Чтобы это работало с BufferedReader, вам может потребоваться, чтобы вы читали по одному полному тегу <address> за раз.

0 голосов
/ 23 октября 2018
while (scan.hasNextLine()) {

        parser = scan.nextLine();
        // System.out.println(parser);
        if (parser.equals("<adress>")) {
            parser = scan.nextLine();
            // System.out.println(parser);
            int startPosition = parser.indexOf("<adressLine>") + "<adressLine>".length();
            int endPosition = parser.indexOf("</adressLine>", startPosition);
            idNumber = parser.substring(startPosition, endPosition);
            parser = scan.nextLine();

            int startPosition1 = parser.indexOf("<geoCodeGranularity>") + "<geoCodeGranularity>".length();
            int endPosition1 = parser.indexOf("</geoCodeGranularity>", startPosition1);
            time = parser.substring(startPosition1, endPosition1);
            parser = scan.nextLine();

...... Алгоритм должен быть таким.Если вы читаете по файлу.

0 голосов
/ 23 октября 2018

Вы можете преобразовать файл в строку и определить начальный и конечный индексы нужной подстроки, как показано ниже:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Address {

    public static void main(String[] args) throws IOException {

        // Complete File Path
        File dir =
            new File("\\..\\..\\Test.html");

        // Convert File Data As String
        String data =
            new String(
                Files.readAllBytes(Paths
                    .get(dir
                        .getAbsolutePath())));

        // For Loop to get all the <address> tags in the file.
        for (int index = data.indexOf("<address"); index >= 0;) {

            // Start Index
            int startIndex = data.indexOf(">", index + 1);
            ++startIndex;

            // End Index
            int indexOfEnd = data.indexOf("</address>", startIndex + 1);

            String attributesString = data.substring(startIndex, indexOfEnd);
            // Replace below line with desired logic with calling trim() on the String attributesString
            System.out.println(attributesString);

            // Next Address will be after the end of first address
            index = data.indexOf("<address", indexOfEnd + 1);
        }
    }
}
...