2013-03-06 119 views
2

现在我想解析来自webservice的xml。为了解析,我使用了xpath和java。我有以下代码:使用xpath和java解析xml

package test.client; 

import com.sun.org.apache.xpath.internal.NodeSet; 
import java.io.FileReader; 
import java.io.StringReader; 
import javax.lang.model.element.Element; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathFactory; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 

public class GetAlarmsCriticalDataCenterLinksDown { 
    public static void main(String args[]) throws Exception { 
     try { 
      GetAlarms ga = new GetAlarms(); 
      String xml = ga.getAlarms(
       "Alarms", 
       "C:/Documents and Settings/Administrator/My Documents/NetBeansProjects/WebSpectrumDemo/src/java/com/xml/Alarms/GetAlarmsCriticalDataCenterLinksDown.xml"); 
      System.out.println("Response XML:\n " + xml); 
      XPathFactory factory = XPathFactory.newInstance(); 
      XPath xPath = factory.newXPath(); 
      String loc = ""; 
      NodeList nodes = (NodeList) xPath.evaluate(
       "//alarm-response-list/alarm-responses/alarm", 
       new InputSource(new StringReader(xml)), 
       XPathConstants.NODESET); 
      System.out.println("Success : " + nodes.getLength()); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 
} 

和我的字符串XML是什么样子

<?xml version="1.0" encoding="UTF-8"?> 
<alarm-response-list xmlns="http://www.ca.com/spectrum/restful/schema/response" 
        error="EndOfResults" throttle="2" total-alarms="2"> 
    <alarm-responses> 
    <alarm id="51230f5c-11fe-1002-01bc-000c296b3541"> 
     <attribute id="0x1006e">HBBCPMPLSR1.hdfcami.com</attribute> 
     <attribute id="0x11f84" error="NoSuchAttribute" /> 
     <attribute id="0x118cd" /> 
     <attribute id="0x11f4e">1361252188</attribute> 
    </alarm> 
    <alarm id="512313db-c5ee-1003-01bc-000c296b3541"> 
     <attribute id="0x1006e">HBBCPINTR0.hdfcami.com</attribute> 
     <attribute id="0x11f84" error="NoSuchAttribute" /> 
     <attribute id="0x118cd" /> 
     <attribute id="0x11f4e">1361253339</attribute> 
    </alarm> 
    </alarm-responses> 
</alarm-response-list> 

但我卡住了。我得到nodes.getLength() = 0

任何帮助将不胜感激。 我想解析整个XML并获取属性的值。

+0

如果从'alarm-response-list'中删除命名空间,会发生什么? – zwets 2013-03-06 05:54:44

回答

4

您需要在您的XPath对象上设置命名空间。使用XPath.setNamespaceContext()来做到这一点。或者,您可以在XPath表达式中使用本地名称,例如//*[local-name()='alarm-response-list']/*[local-name()='alarm-responses']/*[local-name()='alarm']但名称空间选项更好。

有关在XPath表达式中使用名称空间的大量信息已在另一个答案here中。

+0

得到响应的长度后,我想获得每个属性的值,但我不会得到该属性的值。我使用代码如 – 2013-03-06 07:27:23

+0

感谢您的快速回复............ .. – 2013-03-06 07:32:39

+0

要获取属性元素,遍历NodeList中的所有节点,然后将出来的节点投射到Element元素中。从这些元素中可以获得子元素,XML属性,文本内容等。 – prunge 2013-03-06 08:14:15