2011-07-02 43 views
0

我有一个字符串,如下所示。字符串使用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被要求不要使用解析由于性能issue.I需要使用Java的字符串operation.Please提供我获得第二名雇员的工资(2000 $)一些指针。

您的帮助表示赞赏。

+2

使用xml解析器的AFAIK不会降低性能。如果我错了,通知我。 –

+4

_“由于性能问题而不使用分析”_什么是无意义的! –

+0

您是否通过员工姓名或职位在输入中找到XML节点? – Bohemian

回答

2

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

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

+0

+1 - 用于合理的建议。 –

0

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

+0

如果'emp'在开始时被注释掉,这将不起作用。 –

+0

@Bart Kiers - 你说得对,我的文章只是OP的开始。 –

0

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

检查样本,是非常容易使用

此,如果你不想自己解析... :)

0

使用XML解析器或JAXB API,用于解组字符串为对象,就也可以通过这种方式做到这一点。

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; 



} 
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(...)来做到这一点要脆弱得多。

相关问题