Как получить определенное значение внутри строки с помощью StringTokenizer? - PullRequest
1 голос
/ 03 октября 2019

<tag k="addr:street" v="St. Croix gate"/>

public void map(Object key, Text value, Context context
    ) throws IOException, InterruptedException {
        StringTokenizer itr = new StringTokenizer(value.toString());
        while (itr.hasMoreTokens()) {
                    String cb = itr.nextToken();
              if(cb.contains("k=\"addr:street\"")){
                       String roadName = itr.nextToken();

                 while(!roadName.contains("\"/>")) {
                      roadName = roadName + itr.nextToken();

                  }
                  word.set(roadName);
                  context.write(word, one);
            }

        }
    }
}

Итак, как вы можете видеть, я пытаюсь получить строку внутри v = "St. Croix Gate" />, но так как Tokenizer добавляет новый токен для каждого пробела, ятолько получая на выходе "ворота"

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

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

Однако, если вы хотите извлечь константы v, используя только манипуляции со строкамиВот один из способов сделать это:

String s = "<tag k=\"addr:street\" v=\"St. Croix gate\"/>";
int vIndex = s.indexOf("v=\"");
int vendQuotesIndex = s.indexOf("\"", vIndex + 3);
System.out.println(s.substring(vIndex + 3, vendQuotesIndex)); // Prints "St. Croix gate"
0 голосов
/ 03 октября 2019

это сработало для меня:

    String element = "<tag k=\"addr:street\" v=\"St. Croix gate\"/>";
    String searchAtt = "v";
    StringTokenizer itr = new StringTokenizer(element);
    while (itr.hasMoreTokens()) {
        // split by '='
        String s = itr.nextToken("=");
        // is splited by '=' so the last word is the attribute name
        if (s.endsWith(searchAtt)) {
            // next token is '=' then comes the value of the attribute
            // split it by \"
            itr.nextToken("\"");
            // next token will be the content
            String content = itr.nextToken();
            System.out.println("Searched attribute: " + content);
        }
    }
...