使用xpath和java解析xml
现在我想解析来自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并获取属性的值。
您需要在您的XPath
对象上设置命名空间。使用XPath.setNamespaceContext()
来做到这一点。或者,您可以在XPath表达式中使用本地名称,例如//*[local-name()='alarm-response-list']/*[local-name()='alarm-responses']/*[local-name()='alarm']
但名称空间选项更好。
有关在XPath表达式中使用名称空间的大量信息已在另一个答案here中。
得到响应的长度后,我想获得每个属性的值,但我不会得到该属性的值。我使用代码如 – 2013-03-06 07:27:23
感谢您的快速回复............ .. – 2013-03-06 07:32:39
要获取属性元素,遍历NodeList中的所有节点,然后将出来的节点投射到Element元素中。从这些元素中可以获得子元素,XML属性,文本内容等。 – prunge 2013-03-06 08:14:15
如果从'alarm-response-list'中删除命名空间,会发生什么? – zwets 2013-03-06 05:54:44