`
帅气的小码农
  • 浏览: 7125 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用jaxb解析xml字符串转对象,忽略xml的命名空间

    博客分类:
  • java
 
阅读更多

首先做一个主要工具类,然后以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;
 	}
}

 

 

分享到:
评论

相关推荐

    JAVA JAXB 解析XML嵌套子节点为字符串

    当我们面临XML文档中存在嵌套子节点,并且希望将其解析为字符串时,JAXB提供了一种有效的方法。 首先,我们需要理解XML文档的基本结构。XML是一种可扩展标记语言,它通过标签来定义元素和数据,允许数据以层次结构...

    利用JAXB进行xml和javabean之间转换

    同样,通过`JAXBContext`创建一个unmarshaller对象,调用其`unmarshal()`方法,可以将XML字符串或文件转换回Java对象。 **2. 示例代码** ```java import javax.xml.bind.annotation.XmlElement; import javax.xml...

    jaxb解析xml

    通过调用`Unmarshaller.unmarshal()`方法,可以将XML字符串或XML文件解析为对应的Java对象。 4. **Marshaller接口**:相反,`Marshaller`接口则用于将Java对象转换为XML格式。通过`Marshaller.marshal()`方法,我们...

    JAXB工具类 xml转为java对象 java对象转为xml

    有了这个Java类,你可以使用Unmarshaller将XML字符串或文件解析为Java对象: ```java import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import java.io.File; public class Main { ...

    xml格式的字符串转换成List

    3. **解析到对象**:使用选择的库将XML字符串解析为对象。以Java的JAXB为例: ```java JAXBContext jaxbContext = JAXBContext.newInstance(Item.class); Unmarshaller unmarshaller = jaxbContext....

    利用jaxb实现xml和bean互转

    5. **Unmarshalling**: 使用`Unmarshaller`对象将XML字符串或文件解析回Java Bean实例。 6. **绑定文件(bindings file)**: 如果默认的注解不满足需求,可以创建一个绑定文件来更精细地控制XML到Java的映射。 **...

    stax+jaxb进行xml解析

    - 反之,使用Marshaller对象的marshal方法,将Java对象转换为XML字符串或写入文件。 4. **所需库**: - StAX的实现库,如Woodstax,需要添加对应的依赖。 - JAXB是Java标准的一部分,但在Java 9及以上版本中已被...

    map/list集合转化成xml字符串 xml字符串转化成map/list集合

    同样的,你可以创建一个解析器来将XML字符串解析成`List`对象,但你需要知道预期的XML结构以便正确地构建对象。 在实际项目中,通常会有更复杂的XML结构,可能包含嵌套的Map和List,这可能需要递归方法或额外的逻辑...

    JDK自带方法解析xml特定格式的字符串

    2. 使用`parse()`方法解析XML字符串为`Document`对象。 3. 遍历和操作`Document`对象,获取XML数据。 对于初学者来说,理解并熟练掌握这些步骤至关重要,因为XML解析是Java开发中常见的需求,尤其在数据交换和配置...

    JAXB xml与对象转换

    5. **Marshalling**:使用Marshaller对象的`marshal()`方法,将Java对象转换成XML字符串或写入XML文件。 ### 示例代码 ```java import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind....

    xml解析和生成字符串、文档的实例

    本文将深入探讨如何使用Java进行XML的解析和生成,包括处理XML字符串和XML文件。 首先,让我们从解析XML字符串开始。在Java中,我们可以使用`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`来...

    jaxb xml 转map

    1. 创建一个XML解析器:使用`javax.xml.parsers.DocumentBuilderFactory`来创建一个解析器,然后使用该解析器来解析XML字符串或文件,得到`org.w3c.dom.Document`对象。 2. 遍历XML节点:通过`Document`对象获取根...

    xml转javaBean,javaBean转xml,xml标签大小写问题,以及对xml特殊符号的处理

    通过调用Marshaller的marshal()方法,我们可以将JavaBean对象转换为XML字符串或者写入XML文件。 3. XML标签大小写问题: XML是大小写敏感的,这意味着“element”和“Element”被视为不同的元素。在定义XML Schema...

    java 中HttpClient传输xml字符串实例详解

    至此,我们已经成功地使用Java的HttpClient库将一个对象转换为XML字符串,并以二进制流的方式发送到了服务器。这个过程中涉及的关键技术包括对象到XML的转换(JAXB)、流操作(ByteArrayOutputStream和...

    jaxb (XML操作)

    这个过程是将Java对象"序列化"为XML字符串或写入XML文件。 **使用JAXB的关键步骤:** 1. **创建Java类模型**:基于XML Schema定义的结构,JAXB可以自动生成Java类,或者你可以手动编写符合XML结构的Java类。 2. *...

    JAXB与xml相互转换实例

    这个过程可以通过调用`JAXBContext`的`createMarshaller()`方法创建一个marshaller对象,然后使用`marshal()`方法将Java对象转换为XML字符串或写入XML文件。 2. **XML到对象的转换(Unmarshalling)**: 反之,...

    JAXB 生成XML文件

    这通常通过调用`Unmarshaller`接口的方法完成,如`unmarshaller.unmarshal(xmlSource)`,它可以从XML源(如文件、流或字符串)创建相应的Java对象。 5. **绑定上下文(Binder)**:`Binder`接口提供了在Java对象和...

    xml与实体类转换工具

    4. **XML字符串转实体类**:首先,可能需要将输入的XML字符串转换为`Document`对象,然后按照上述步骤进行反序列化。 5. **实体类转XML**:反之,使用`Marshaller`将Java对象序列化为XML字符串。例如,`marshaller....

    实体类生成XML格式字符串

    这段代码会生成一个XML字符串,内容类似于: ```xml 张三 &lt;age&gt;30 北京 北京市 ``` 注意,JAXB默认不会生成XML声明(如`&lt;?xml version="1.0" encoding="UTF-8"?&gt;`),如果需要,可以设置Marshaller的...

    用jaxb 实现 xml转java对象技术

    3. **对象到XML的转换**: 使用`JAXBContext`实例化上下文,然后通过`Marshaller`对象将Java对象转换为XML字符串或文件。 4. **XML到对象的转换**: 类似地,使用`Unmarshaller`对象可以将XML数据恢复为Java对象。 *...

Global site tag (gtag.js) - Google Analytics