我有一个字符串如下。
<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>
您的帮助表示赞赏。
答案 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;
}