我正在开发一个没有架构的项目,我必须手动解析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,注释就会自动生成列表
答案 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代码。
答案 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);
}
}