首先做一个主要工具类,然后以xml的根元素为一个实体,实体中串联子元素的实体,子元素的属性分别代表其元素,注意在getter上会反复获取两次,需要手动get前注入@XmlElement
xml字符串样板
<?xml version="1.0" encoding="UTF-8"?> <MSG xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.travelsky.com/2006/dcsi"> <META> <SNDR>SCS_PE</SNDR> <SEQN>123</SEQN> <DTTM>20100704113058</DTTM> <TYPE>PSIN</TYPE> <STYP>PSCB</STYP> </META> <PSIN> <BID>054248001</BID> <FID>CA123</FID> <FDATE>15SEP15</FDATE> <PSCB> <PSST>O</PSST> <PSTM>20060324112858</PSTM> </PSCB> </PSIN> </MSG>
编写工具类代码
package com.royalnu.common.utils.xml; import java.io.StringReader; import java.util.Collections; import java.util.LinkedList; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.Source; import javax.xml.transform.sax.SAXSource; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import com.royalnu.common.exception.CommonException; public class XmlUtils { /** * 一个xml字符串转对象,忽略xml命名空间 * @param xml * @param msgVo 根元素实体 * @return */ @SuppressWarnings("unchecked") public static <T> T xmlToBean(String xml,Class<T> msgVo)throws JAXBException,SAXException,ParserConfigurationException,CommonException { if (msgVo==null) { return null; } JAXBContext context = JAXBContext.newInstance(msgVo); Unmarshaller unmarshaller = context.createUnmarshaller(); Source source = trunSource(xml); return (T)unmarshaller.unmarshal(source); } /** * xml字符串集合转对象,忽略xml命名空间 * @param xml xml字符串集合 * @param msgVo 根元素实体 */ @SuppressWarnings("unchecked") public static <T> List<T> xmlToBean(List<String> xmlList,Class<T> msgVo)throws JAXBException,SAXException,ParserConfigurationException { if (msgVo==null) { return Collections.EMPTY_LIST; } List<T> beanList = new LinkedList<T>(); JAXBContext context = JAXBContext.newInstance(msgVo); Unmarshaller unmarshaller = context.createUnmarshaller(); for (String xmlStr : xmlList) { Source source = trunSource(xmlStr); beanList.add((T)unmarshaller.unmarshal(source)); } return beanList; } private static Source trunSource(String xmlStr) throws SAXException,ParserConfigurationException { StringReader reader = new StringReader(xmlStr); SAXParserFactory sax = SAXParserFactory.newInstance(); sax.setNamespaceAware(false); XMLReader xmlReader = sax.newSAXParser().getXMLReader(); Source source = new SAXSource(xmlReader, new InputSource(reader)); return source; } }
对应实体
//根元素实体 package com.royalnu.psis.interfaces.psp.api.vo; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import lombok.Setter; @Setter @XmlAccessorType(XmlAccessType.PROPERTY) @XmlRootElement(name = "MSG") public class PspLuggageSeizeInfoMsgVo { private PspLuggageSeizeInfoVo pspLuggageSeizeInfoVo; @XmlElement(name="PSIN") public PspLuggageSeizeInfoVo getPspLuggageSeizeInfoVo() { return pspLuggageSeizeInfoVo; } } //第二个串联的实体 package com.royalnu.psis.interfaces.psp.api.vo; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import lombok.Setter; @Setter @XmlAccessorType(XmlAccessType.PROPERTY) public class PspLuggageSeizeInfoVo { /** * <pre> * 行李条号 * </pre> * */ private String bid; @XmlElement(name="BID") public String getBid() { return bid; } /** * <pre> * 行李所属航班号 * </pre> * */ private String fid; @XmlElement(name="FID") public String getFid() { return fid; } /** * <pre> * 航班日期 * </pre> * */ private String fdate; @XmlElement(name="FDATE") public String getFdate() { return fdate; } /** * <pre> * 安检消息标识(Y:开包 S:安扣) * </pre> * */ private PspLuggageSeizeInfoPscbVo pscbVo; @XmlElement(name="PSCB") public PspLuggageSeizeInfoPscbVo getPscbVo() { return pscbVo; } private String uuid; @XmlElement(name="UUID") public String getUuid() { return uuid; } } //最后一个串联的实体 package com.royalnu.psis.interfaces.psp.api.vo; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import lombok.Setter; @Setter @XmlAccessorType(XmlAccessType.PROPERTY) public class PspLuggageSeizeInfoPscbVo { /** * <pre> * 安检状态 * </pre> * */ private String psst; @XmlElement(name="PSST") public String getPsst() { return psst; } /** * <pre> * 安检时间 * </pre> * */ private String pstm; @XmlElement(name="PSTM") public String getPstm() { return pstm; } }
相关推荐
当我们面临XML文档中存在嵌套子节点,并且希望将其解析为字符串时,JAXB提供了一种有效的方法。 首先,我们需要理解XML文档的基本结构。XML是一种可扩展标记语言,它通过标签来定义元素和数据,允许数据以层次结构...
同样,通过`JAXBContext`创建一个unmarshaller对象,调用其`unmarshal()`方法,可以将XML字符串或文件转换回Java对象。 **2. 示例代码** ```java import javax.xml.bind.annotation.XmlElement; import javax.xml...
通过调用`Unmarshaller.unmarshal()`方法,可以将XML字符串或XML文件解析为对应的Java对象。 4. **Marshaller接口**:相反,`Marshaller`接口则用于将Java对象转换为XML格式。通过`Marshaller.marshal()`方法,我们...
有了这个Java类,你可以使用Unmarshaller将XML字符串或文件解析为Java对象: ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import java.io.File; public class Main { ...
3. **解析到对象**:使用选择的库将XML字符串解析为对象。以Java的JAXB为例: ```java JAXBContext jaxbContext = JAXBContext.newInstance(Item.class); Unmarshaller unmarshaller = jaxbContext....
5. **Unmarshalling**: 使用`Unmarshaller`对象将XML字符串或文件解析回Java Bean实例。 6. **绑定文件(bindings file)**: 如果默认的注解不满足需求,可以创建一个绑定文件来更精细地控制XML到Java的映射。 **...
- 反之,使用Marshaller对象的marshal方法,将Java对象转换为XML字符串或写入文件。 4. **所需库**: - StAX的实现库,如Woodstax,需要添加对应的依赖。 - JAXB是Java标准的一部分,但在Java 9及以上版本中已被...
同样的,你可以创建一个解析器来将XML字符串解析成`List`对象,但你需要知道预期的XML结构以便正确地构建对象。 在实际项目中,通常会有更复杂的XML结构,可能包含嵌套的Map和List,这可能需要递归方法或额外的逻辑...
2. 使用`parse()`方法解析XML字符串为`Document`对象。 3. 遍历和操作`Document`对象,获取XML数据。 对于初学者来说,理解并熟练掌握这些步骤至关重要,因为XML解析是Java开发中常见的需求,尤其在数据交换和配置...
5. **Marshalling**:使用Marshaller对象的`marshal()`方法,将Java对象转换成XML字符串或写入XML文件。 ### 示例代码 ```java import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind....
本文将深入探讨如何使用Java进行XML的解析和生成,包括处理XML字符串和XML文件。 首先,让我们从解析XML字符串开始。在Java中,我们可以使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`来...
1. 创建一个XML解析器:使用`javax.xml.parsers.DocumentBuilderFactory`来创建一个解析器,然后使用该解析器来解析XML字符串或文件,得到`org.w3c.dom.Document`对象。 2. 遍历XML节点:通过`Document`对象获取根...
通过调用Marshaller的marshal()方法,我们可以将JavaBean对象转换为XML字符串或者写入XML文件。 3. XML标签大小写问题: XML是大小写敏感的,这意味着“element”和“Element”被视为不同的元素。在定义XML Schema...
至此,我们已经成功地使用Java的HttpClient库将一个对象转换为XML字符串,并以二进制流的方式发送到了服务器。这个过程中涉及的关键技术包括对象到XML的转换(JAXB)、流操作(ByteArrayOutputStream和...
这个过程是将Java对象"序列化"为XML字符串或写入XML文件。 **使用JAXB的关键步骤:** 1. **创建Java类模型**:基于XML Schema定义的结构,JAXB可以自动生成Java类,或者你可以手动编写符合XML结构的Java类。 2. *...
这个过程可以通过调用`JAXBContext`的`createMarshaller()`方法创建一个marshaller对象,然后使用`marshal()`方法将Java对象转换为XML字符串或写入XML文件。 2. **XML到对象的转换(Unmarshalling)**: 反之,...
这通常通过调用`Unmarshaller`接口的方法完成,如`unmarshaller.unmarshal(xmlSource)`,它可以从XML源(如文件、流或字符串)创建相应的Java对象。 5. **绑定上下文(Binder)**:`Binder`接口提供了在Java对象和...
4. **XML字符串转实体类**:首先,可能需要将输入的XML字符串转换为`Document`对象,然后按照上述步骤进行反序列化。 5. **实体类转XML**:反之,使用`Marshaller`将Java对象序列化为XML字符串。例如,`marshaller....
这段代码会生成一个XML字符串,内容类似于: ```xml 张三 <age>30 北京 北京市 ``` 注意,JAXB默认不会生成XML声明(如`<?xml version="1.0" encoding="UTF-8"?>`),如果需要,可以设置Marshaller的...
3. **对象到XML的转换**: 使用`JAXBContext`实例化上下文,然后通过`Marshaller`对象将Java对象转换为XML字符串或文件。 4. **XML到对象的转换**: 类似地,使用`Unmarshaller`对象可以将XML数据恢复为Java对象。 *...