xpath对带默认命名空间的xml节点的定位

在解析带有默认命名空间的XML时遇到了问题。原始XML文件包含FortifySoftware的默认命名空间。尝试使用XPath定位<BuildID>元素时,由于命名空间问题导致失败。最初的代码不适用,因为不能以'xml'开头定义命名空间。解决方案是为默认命名空间添加一个自定义前缀,例如'ns',然后在XPath表达式中使用这个前缀来正确选择元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近搞xml的解析,有点收获,但是xml方面的知识太多,不能全部掌握,别人有个xml让我帮解析一下,我用平时写的代码去解析,竟然发现有问题:

那个xml是带默认命名空间,文件如下:Sample1.xml

  1. <?xml version="1.0" encoding="UTF-8" ?> 
  2.    <NewDataSet xmlns="xmlns://www.fortifysoftware.com/schema/fvdl"
  3.      <FVDL xmlns="xmlns://www.fortifysoftware.com/schema/fvdl" > 
  4.         <CreatedTS date="2008-08-24" time="10:41:13" /> 
  5.          <Build xmlns="xmlns://www.fortifysoftware.com/schema/fvdl"
  6.             <BuildID>Sample1 </BuildID> 
  7.             <NumberFiles>1 </NumberFiles> 
  8.             <LOC>11 </LOC> 
  9.         </Build> 
  10.     </FVDL> 
  11.     <FunctionCall/> 
  12.   </NewDataSet> 

它想得到<BuildID>Sample1 </BuildID> 这个元素。我当时写的代码如下:

 

  1. SAXBuilder sb = new SAXBuilder();
  2. try {
  3.             Document doc = sb.build("C://Sample1.xml");
  4.             Element root=doc.getRootElement(); 
  5.             String s = root.getName();
  6.             XPath xpath = XPath.newInstance("//BuildID"); 
  7.             Element ele = (Element)xpath.selectSingleNode(doc); //得到BuildID元素 
  8.             //xpath.addNamespace("xmlns", "xmlns://www.fortifysoftware.com/schema/fvdl");//添加命名空间
  9.            System.out.println(ele.getName());
  10.             String str = ele.getText(); 
  11.             System.out.println(str);
  12.             XMLOutputter xmlout = new XMLOutputter(Format.getPrettyFormat());
  13.             xmlout.output(doc,System.out);
  14.         } catch (Exception e) {
  15.             
  16.             e.printStackTrace();
  17.         } 

运行后报空指针。找了半天没找出来,后来就想会不会是命名空间的问题。于是就把xml里面的命名空间都去掉了。发现这下可以正确解析了。

但是那哥们说,命名空间他不想去掉。改怎么弄?我就把上面被注释掉的代码

  1. 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作为前缀

修改后代码如下:

  1. SAXBuilder sb = new SAXBuilder();
  2. try {
  3.             Document doc = sb.build("C://Sample1.xml");
  4.             XPath xpath = XPath.newInstance("//ns:BuildID"); //BuildID的全名是ns:BuildID
  5.             xpath.addNamespace("ns""xmlns://www.fortifysoftware.com/schema/fvdl");
  6.            //对于默认命名空间,我们在解析时要自己添加一个前缀
  7.             
  8.             Element ele = (Element)xpath.selectSingleNode(doc); 
  9.             System.out.println(ele.getName());
  10.             String str = ele.getText(); 
  11.             System.out.println(str);
  12.                  
  13.         } catch (Exception e) {         
  14.             e.printStackTrace();
  15.         } 

问题解决

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值