2014-02-21 2 views
0

У меня есть следующая строка, которая создается внешней программой (OpenVAS) и успешно возвращается в мою программу в виде строки.Разбиение строки без пробелов

<create_target_response id="b4c8de55-94d8-4e08-b20e-955f97a714f1" status_text="OK, resource created" status="201"></create_target_response> 

Я пытаюсь разделить строку, чтобы дать мне «b4c8d .... 14F1» без кавычек. Я пробовал всевозможные методы эвакуации и продолжаю получать метод else: «String не содержит идентификатор цели». Я попытался удалить проверку IF для строки, но по-прежнему имеет ту же проблему. Цель состоит в том, чтобы получить мою строку id в jTextField6. String Lob содержит полную строку, как указано выше.

 if (Lob.contains("id=\"")){ 
     // put the split here 
      String[] parts = Lob.split("id=\""); 
      String cut1 = parts[1]; 

      String[] part2 = cut1.split("\""); 
      String TaskFinal = part2[0]; 

      jTextField6.setText(TaskFinal); 

     } 
     else { 
      throw new IllegalArgumentException("String does not contain a Target ID"); 
     } 

    } catch (IOException e) { 
    e.printStackTrace(); 
    } 

Кажется, мне нужно только, чтобы избежать ", а не = (Java поднимает ошибку, если я делаю)

Заранее спасибо

EDIT: код, как она стоит сейчас, используя jSoup Lib - The «ID» строка не будет отображать Любые идеи Благодаря

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
      String TargIP = jTextField1.getText(); // Get IP Address 
      String TargName = jTextField5.getText(); // Get Target Name 
      String Vag = "8d32ad99-ac84-4fdc-b196-2b379f861def"; 
      String Lob = ""; 

    final String dosCommand = "cmd /c omp -u admin -w admin --xml=\"<create_target><name>" + TargName + "</name><hosts>" + TargIP + "</hosts></create_target>\""; 
    3</comment><config id='daba56c8-73ec-11df-a475-002264764cea'/><target id='" + Vag + "'/></create_task>\""; 
    final String location = "C:\\"; 
    try { 
    final Process process = Runtime.getRuntime().exec(
     dosCommand + " " + location); 
    final InputStream in = process.getInputStream(); 
    int ch; 
    while((ch = in.read()) != -1) { 
     System.out.print((char)ch); 
     Lob = String.valueOf((char)ch); 
     jTextArea2.append(Lob); 


    } 

    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
      String id = Jsoup.parse(Lob).getAllElements().attr("id"); 
    System.out.println(id); // This doesn't output? 
} 
+3

Вы должны попробовать xml-parser. это будет намного проще и лучше для вас. – Sanjeev

ответ

0

Все говорят, что вы используете XML парсер (и они правы), но никто не показывает вам, как это сделать.

Здесь идет:

String lob = ... 

Использование Jsoup из http://jsoup.org, на самом деле HTML-парсер, но и обрабатывает XML аккуратно:

String id = Jsoup.parse(lob).getAllElements().attr("id"); 
// b4c8de55-94d8-4e08-b20e-955f97a714f1 

С помощью встроенного API, XML Java, менее лаконичным, но не Addtional библиотек :

Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder() 
    .parse(new InputSource(new StringReader(lob))); 
String id = dom.getDocumentElement().getAttribute("id"); 
// b4c8de55-94d8-4e08-b20e-955f97a714f1 
+0

Привет - Спасибо за вашу помощь в этом. Я использовал метод jSoup, описанный выше, но, похоже, не может получить вывод строки id. – Remotejon

+0

Попытайтесь добавить код в том виде, в котором он находится. Вероятно, наверху – Remotejon

0

Это намного проще, чем вы делаете это, на мой взгляд Во-первых, разделить на.?. 10, затем проверьте наличие =. Если это так, split на = и, наконец, удалите " со второго токена.

Сложный бит - это пробелы внутри "". Для этого потребуются некоторые регулярные выражения, которые вы можете использовать с this question.

Пример

String input; // Assume this contains the whole string. 
String pattern; // Have fun working out the regex. 

String[] values = input.split(pattern); 

for(String value : values) 
{ 
    if(value.contains("=")) { 
     String[] pair = value.split("="); 
     String key = pair[0]; 
     String value = pair[1].replaceAll("\""); 

     // Do something with the values. 
    } 
} 

Преимущество моего подхода

Это при условии, что вход соответствует формату key="value" key="value", вы можете разобрать все, что приходит через, а не жесткое кодирование имени атрибуты.

И если это XML ..

Затем с помощью XML-анализатор. Существует хороший (удивительный) ответ, который объясняет, почему вы не должны использовать манипуляции String для анализа XML/HTML. Here - ответ.

0

Вы можете использовать регулярное выражение для извлечения необходимого; Более того, похоже, что значение id является UUID. Поэтому:

private static final Pattern PATTERN 
    = Pattern.compile("\\bid=\"([^\"]+)\""); 

// In code... 
public String getId(final String input) 
{ 
    final Matcher m = PATTERN.matcher(input); 
    if (!m.find()) 
     throw new IllegalArgumentException("String does not contain a Target ID"); 
    final String uuid = m.group(1); 
    try { 
     UUID.fromString(uuid); 

    } catch (IllegalArgumentException ignored) { 
     throw new IllegalArgumentException("String does not contain a Target ID"); 
    } 

    return uuid; 
} 
1

Это поможет вам ваш идентификатор задания более легко:.

int idStart = Lob.indexOf("id=")+("id=\"").length(); 
System.out.println(Lob.substring(idStart,Lob.indexOf("\"",idStart))); 
+0

Можете упомянуть, что 4 - длина 'id = '' (или, еще лучше, сделать эту строку переменной и использовать ее .length() ') - меньше магических чисел, чтобы помнить, когда возвращались к код за неделю. –

+0

@PhilippReichart Обновлен мой ответ. Спасибо за предложение. – SANN3

1

Split на основе»Вы можете получить все ключевые значения

String str = "<create_target_response id=\"b4c8de55-94d8-4e08-b20e-955f97a714f1\" status_text=\"OK, resource created\" status=\"201\"></create_target_response>"; 
String[] tokens = str.split("\\\""); 
System.out.println(tokens[1]); 
System.out.println(tokens[5]); 

выход.:

b4c8de55-94d8-4e08-b20e-955f97a714f1 
201 
+0

Не понимаю, почему вы изменили строку 'str'. OpenVAS не включает эти обратные пространства при отправке XML в мою программу? – Remotejon

+0

Двойной quote '' 'используется в Java для обозначения начала и конца строкового значения. Если вам нужна буквальная '' 'в вашей строке, она должна быть экранирована как' \ "', см. Раздел в разделе [«Escape Sequences» в учебнике Java] (http://docs.oracle.com/javase/ tutorial/java/data/characters.html) для получения дополнительной информации. –

Смежные вопросы