最近搞xml的解析,有点收获,但是xml方面的知识太多,不能全部掌握,别人有个xml让我帮解析一下,我用平时写的代码去解析,竟然发现有问题:
那个xml是带默认命名空间,文件如下:Sample1.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <NewDataSet xmlns="xmlns://www.fortifysoftware.com/schema/fvdl">
- <FVDL xmlns="xmlns://www.fortifysoftware.com/schema/fvdl" >
- <CreatedTS date="2008-08-24" time="10:41:13" />
- <Build xmlns="xmlns://www.fortifysoftware.com/schema/fvdl">
- <BuildID>Sample1 </BuildID>
- <NumberFiles>1 </NumberFiles>
- <LOC>11 </LOC>
- </Build>
- </FVDL>
- <FunctionCall/>
- </NewDataSet>
它想得到<BuildID>Sample1 </BuildID> 这个元素。我当时写的代码如下:
- SAXBuilder sb = new SAXBuilder();
- try {
- Document doc = sb.build("C://Sample1.xml");
- Element root=doc.getRootElement();
- String s = root.getName();
- XPath xpath = XPath.newInstance("//BuildID");
- Element ele = (Element)xpath.selectSingleNode(doc); //得到BuildID元素
- //xpath.addNamespace("xmlns", "xmlns://www.fortifysoftware.com/schema/fvdl");//添加命名空间
- System.out.println(ele.getName());
- String str = ele.getText();
- System.out.println(str);
- XMLOutputter xmlout = new XMLOutputter(Format.getPrettyFormat());
- xmlout.output(doc,System.out);
- } catch (Exception e) {
- e.printStackTrace();
- }
运行后报空指针。找了半天没找出来,后来就想会不会是命名空间的问题。于是就把xml里面的命名空间都去掉了。发现这下可以正确解析了。
但是那哥们说,命名空间他不想去掉。改怎么弄?我就把上面被注释掉的代码
- xpath.addNamespace("xmlns", "xmlns://www.fortifysoftware.com/schema/fvdl");
用上,程序又报下面这个异常:
org.jdom.IllegalNameException: The name "xmlns" is not legal for JDOM/XML Namespace prefixs: Namespace prefixes cannot begin with "xml" in any combination of case.说是我添加的命名空间不能以xml开头,查了资料以后发现我们添加的确实不能xml字符传开头。
于是我就修改命名空间,给它加个前缀。前缀名字可以任意取。我就取ns作为前缀
修改后代码如下:
- SAXBuilder sb = new SAXBuilder();
- try {
- Document doc = sb.build("C://Sample1.xml");
- XPath xpath = XPath.newInstance("//ns:BuildID"); //BuildID的全名是ns:BuildID
- xpath.addNamespace("ns", "xmlns://www.fortifysoftware.com/schema/fvdl");
- //对于默认命名空间,我们在解析时要自己添加一个前缀
- Element ele = (Element)xpath.selectSingleNode(doc);
- System.out.println(ele.getName());
- String str = ele.getText();
- System.out.println(str);
- } catch (Exception e) {
- e.printStackTrace();
- }
问题解决