java xml annotation get name with namespace,<aaa:bbb> value </aaa:bbb>

时间:2013-11-19 03:24:16

标签: java xml jaxb

我正在开发一个没有架构的项目,我必须手动解析xml响应。 我的问题是我无法使用xml注释获得一些价值。

例如,xml就像:

<?xml version='1.0' encoding='UTF-8' ?>
<autnresponse>
    <action>QUERY</action>
    <response>SUCCESS</response>
    <responsedata>
        <autn:numhits>7</autn:numhits>
    </responsedata>
</autnresponse>

java类是:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "autnresponse")
public class AutonomyResponse {
    private String action;
    private String response;
    private ResponseData responsedata;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "responsedata")
public class ResponseData {
    @XmlElement(name = "numhits",namespace = "autn")
    private String numhits;
    @XmlElement(name = "totalhits")
    private String totalhits;
}

我可以获取操作和响应,但无法获取responsedata中的numhits, 谁能告诉我如何使用注释来处理<autn:numhits>? 太多了,谢谢!

另一个问题是:我在responsedata中有多个<autn:numhits> ....我怎样才能获得Java代码中的所有值。 - &GT;我解决了这个多个相同的标签,只需设置List,注释就会自动生成列表

2 个答案:

答案 0 :(得分:1)

事实是 autn - 只是前缀,而不是命名空间。为了正确处理XML文档,必须声明名称空间。

正确的名称空间声明:

<?xml version='1.0' encoding='UTF-8' ?>
<autnresponse xmlns:autn="http://namespace.here">
    <action>QUERY</action>
    <response>SUCCESS</response>
    <responsedata>
        <autn:numhits>7</autn:numhits>
    </responsedata>
</autnresponse>

您还需要更改注释:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "responsedata")
public class ResponseData {
    @XmlElement(name = "numhits",namespace = "http://namespace.here")
    private String numhits;
    @XmlElement(name = "totalhits")
    private String totalhits;
}

并为您提供最终建议。如果你有这个xml文档的xsd方案,请使用XJC utilit生成java代码。

http://docs.oracle.com/javaee/5/tutorial/doc/bnbah.html

答案 1 :(得分:0)

JAXB和其他能够处理XML Schema的XML处理器将把:之前的所有内容都当作命名空间前缀。如果是结肠,那么您可以执行以下操作。

Java模型

您需要指定您的元素名称包含:字符。

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseData {

    @XmlElement(name = "autn:numhits")
    private String numhits;

    private String totalhits;

}

<强>演示

import javax.xml.bind.*;
import javax.xml.parsers.*;
import org.xml.sax.XMLReader;

public class Demo {

    public static void main(String[] args) throws Exception {
        // Create a SAXParser that is not namespace aware
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();

        // Create the JAXBContext
        JAXBContext jc = JAXBContext.newInstance(AutonomyResponse.class);

        // Instead of Unmarshaller we will use an UnmarshallerHandler
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();

        // Do a SAX parse with the UnmarshallerHanlder as the ContentHandler
        xr.setContentHandler(unmarshallerHandler);
        xr.parse("src/forum20062536/input.xml");

        // Get the result of the unmarshal
        AutonomyResponse autonomyResponse = (AutonomyResponse) unmarshallerHandler.getResult();

        // Marshal the object back to XML
        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(autonomyResponse, System.out);
    }

}