解析xml文件问题
我调用webservice,传回来的是一个字符串,但这个字符串的内容是xml文件那种格式。
比如:传回来的字符串
<?xml version="1.0" encoding="UTF-8"?>
........
<info>
<name>Hello</name>
<age>20</age>
</info>
........
字符串的内容就是xml文件信息,只不过使用字符串表示出来了xml文件里面的内容,
我使用SAX来解析实际的xml是可以的,但就不知道怎么解析这种字符串了,大家有好的
办法吗?我先用字符串生成实际的xml文件,然后再解析实际的xml文件?还是怎么弄啊?
纠结啊。。。。。。
------解决方案--------------------用Web service返回的字串内容可以包装成javax.xml.transform.Source类型的对象,然后用你喜欢的方式(各种开源的库或者直接用JDK提供的dom api或者sax api)解析成xml对象,然后就是想干嘛干嘛。
关于javax.xml.transform.Source已知的实现有下面几种DOMSource, JAXBSource, SAXSource, StAXSource, StreamSource
怎么选择其实是无所谓的(当然各种实现可能在处理上有快慢之分,LZ有兴趣可以自己研究),推荐用StAXSource
贴几行代码
1.用DOM API
((DOMSource) source).getNode().getFirstChild(); //得到xml的根元素对象,后面的处理参照java dom api
2.用JAXB
JAXBContext respJc = JAXBContext.newInstance(RootElment.class.getPackage().getName()); //RootElment为事先定义好的跟xml文档内容匹配的对象,具体请参照JAXB文档
unmarshaller umsh = respJc.createUnmarshaller();
JAXBElement<RootElment> jaxbEle = umsh.unmarshal(source,RootElment.class);//这里的source是返回的xml文本流,也就是楼主说的XML字符串
RootElment respEle = jaxbEle.getValue(); //直接unmarshal成了我们需要的类
------解决方案--------------------可以使用dom4j 导入他的包
把字符串生成.xml文件 如取名为pageString.xml
public class 查
{
public static void main(String[] args) throws DocumentException
{
SAXReader reader = new SAXReader();
File file=new File("src/xml/描述数据.xml");
//File file=new File("D:/MyEclipse 9/dropins/artifacts.xml");
Document doc = reader.read(file);
System.out.println(doc.asXML());
// 1.找根节点
Element gen = doc.getRootElement();
//System.out.println(gen);
// 2.找 儿子
List<Element> erzis = gen.elements();
//System.out.println(erzis.size());
for (Element ez : erzis)
{
//System.out.println(ez.getName());
List<Element> szs = ez.elements();
for (Element sz : szs)
{
// System.out.println("\t" + sz.getName());
// System.out.println("路径:"+sz.getPath());
}
}
// 3.找 父节点
Element fu = erzis.get(0).getParent();
//System.out.println(fu.getName()+"-----");
//4.用XPath进行绝对路径查找
List<Element> 电影s =doc.selectNodes("美女s/美女/电影s/电影");
/*System.out.println(电影s.size());
for( Element dy : 电影s)
{
System.out.println( dy.getTextTrim());
}*/
List<Attribute> daoYan = doc.selectNodes("美女s/美女/电影s/电影/@导演");
for( Attribute a :daoYan )
{
System.out.println( a.getPath() );
}
}
}
------解决方案--------------------使用模式匹配,也可以使用字符或字节流(存储在内存中),先写进去输出流,再用输入流传入SAX的构造中。。。
------解决方案--------------------String xmlString ="XML格式字符串";
SAXReader saxReader = new SAXReader();
Document document = null;
try{
document = saxReader.read(new StringReader(xmlString));
} catch(Exception e){
e.printStackTrace();
}
Element root = document.getRootElement();
//获取节点信息
Element eInfo = root.element("info");
Element eName = info.element("name");
String name = name.getTextTrim();