String使用java在字符串中获取特定值的操作

时间:2011-07-02 07:07:17

标签: java

我有一个字符串如下。

<employees>
<emp>
<name>yaakobu</name>
<sal>$20000</sal>
<designation>Manager</designation>
</emp>

<emp>
<name>daaniyelu</name>
<sal>$2000</sal>
<designation>Operator</designation>
</emp>

<emp>
<name>paadam</name>
<sal>$7000</sal>
<designation>Engineer</designation>
</emp>
</employees>

上面的xml我作为string.i被要求不使用解析由于性能问题。我需要使用java的字符串操作获得第二个员工的工资(2000美元)。请给我一些指示。< / p>

您的帮助表示赞赏。

5 个答案:

答案 0 :(得分:2)

你的字符串是xml。 尽管使用正则表达式或其他字符串操作从xml中提取数据可能很诱人 - 不要这样做 - 这是一种不好的做法。

您应该使用一些XML解析器。

答案 1 :(得分:2)

使用字符串操作完成此操作后,请尝试以下操作:

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;

public class Main {
  public static void main(String[] args) throws Exception {
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    Document doc = builder.parse("test.xml");
    XPath xpath = XPathFactory.newInstance().newXPath();

    // get the salary from the employee at index 1
    XPathExpression expr = xpath.compile("//emp[1]/sal"); 
    Object salary = expr.evaluate(doc, XPathConstants.STRING);
    System.out.println(salary);
  }
}

应输出:

$20000

我不保证它会更快,但我认为它不会有太大差异。这样做会比使用indexOf(...)substring(...)调用做到这一点要脆弱得多。

答案 2 :(得分:0)

我怀疑使用xml解析器会出现性能问题,但如果您想通过字符串解析来执行此操作,请使用str.indexOf("<sal>", str.indexOf("<sal>") + 5);然后这将很容易。

答案 3 :(得分:0)

你可能会使用xstream http://x-stream.github.io/ 你把你的xml放在一个对象结构中并从那里得到它。

检查样品,非常好用

如果您不想解析自己......:)

答案 4 :(得分:0)

使用xml解析器或JAXB api将String解组为对象,也可以通过这种方式完成。

private static Object getObject(String yourXml) throws Exception {



    JAXBContext jcUnmarshal = null;

    Unmarshaller unmarshal = null;

    javax.xml.stream.XMLStreamReader rdr = null;



    //Object obj = null;

    try {



        jcUnmarshal = JAXBContext.newInstance("com.test.dto");

        unmarshal = jcUnmarshal.createUnmarshaller();

        rdr = javax.xml.stream.XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(yourXml));



        //obj = (Object) unmarshal.unmarshal(rdr);

        return (Object) unmarshal.unmarshal(rdr);



    } catch (JAXBException jaxbException) {

        jaxbException.printStackTrace();

        log.error(jaxbException);

        throw new ServiceException(jaxbException.getMessage());

    }

    finally{

        jcUnmarshal = null;

        unmarshal = null;

        rdr.close();

        rdr = null;

    }



    //return obj;



}