0

我有以下由外部程序(OpenVAS)生成并作为字符串成功返回到我的程序的字符串。

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

我正在尝试拆分字符串以给我“b4c8d....14f1”而没有引号。我尝试了各种转义方法,并不断得到 else 方法“字符串不包含目标 ID”。我尝试删除检查字符串的 IF 语句,但仍然遇到同样的问题。目标是将我的 id 字符串放入 jTextField6。字符串 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会引发错误)

提前致谢

编辑:现在使用 jSoup lib 的代码 - '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? 
}
4

5 回答 5

1

这将使您更轻松地获得您的工作 ID:

int idStart = Lob.indexOf("id=")+("id=\"").length();
System.out.println(Lob.substring(idStart,Lob.indexOf("\"",idStart)));
于 2014-02-21T10:41:30.317 回答
1

在“的基础上进行拆分。可以得到所有的键值。

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
于 2014-02-21T10:42:20.073 回答
0

在我看来,这比你做的要简单得多。首先,拆分space,然后检查是否=存在。如果是,则split在 上=,最后"从第二个令牌中删除 。

棘手的一点是"". 这将需要一些正则表达式,您可以从这个问题中解决。

例子

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。是答案。

于 2014-02-21T10:40:15.490 回答
0

每个人都在告诉您使用 XML 解析器(他们是对的),但没有人告诉您如何使用。

开始:

String lob = ...

使用来自http://jsoup.org的Jsoup ,实际上是一个 HTML 解析器,但也可以巧妙地处理 XML:

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

使用内置 Java XML API,不太简洁但没有额外的库:

Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder()
    .parse(new InputSource(new StringReader(lob)));
String id = dom.getDocumentElement().getAttribute("id");
// b4c8de55-94d8-4e08-b20e-955f97a714f1
于 2014-02-21T10:57:17.567 回答
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;
}
于 2014-02-21T10:40:47.477 回答