使用xpath和java解析xml [英] Parse xml using xpath and java

查看:77
本文介绍了使用xpath和java解析xml的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Now I am want to parse xml which is coming from webservice. For parsing, I used xpath and java. I have the following code:

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);
        }
    }
}

我的String xml看起来像

and my String xml looks like

<?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

But I'm stuck. I'm getting nodes.getLength() = 0.

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

Any help will be appreciated. I want to parse whole xml and get the value of the attribute.

推荐答案

你需要设置命名空间你的 XPath 对象。使用 XPath.setNamespaceContext()来执行此操作。或者,您可以在XPath表达式中使用本地名称,例如 // * [本地名称()= '报警响应列表'] / * [本地名称()= '报警响应'] / * [本地名称()='报警'] 但命名空间选项更好。

You need to set up namespaces on your XPath object. Use XPath.setNamespaceContext() to do this. Alternatively you could just use local names in your XPath expression, e.g. //*[local-name()='alarm-response-list']/*[local-name()='alarm-responses']/*[local-name()='alarm'] but the namespace option is better.

有关使用带有XPath表达式的命名空间的大量信息已经在另一个答案这里

A whole lot of information about using namespaces with XPath expressions is already in another answer here.

这篇关于使用xpath和java解析xml的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆