xml对象与字符串互换

这篇具有很好参考价值的文章主要介绍了xml对象与字符串互换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

很多老系统,特别是C++的系统,可能数据结构采用的xml。xml对java来说没有什么,但是C++来说,可能还有个顺序问题,毕竟c++没有那么多通用类库。
2 xstream
先说依赖,我本来不想升级,但是有个问题卡者就给升了,虽然升了并没有解决我的问题。

     <!-- xstream 升级到1.4.18后 依赖的jar -->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.20</version>
        </dependency>
        <dependency>
            <groupId>xmlpull</groupId>
            <artifactId>xmlpull</artifactId>
            <version>1.1.3.4d_b4_min</version>
        </dependency>
        <dependency>
            <groupId>xpp3</groupId>
            <artifactId>xpp3_min</artifactId>
            <version>1.1.4c</version>
        </dependency>

2.3 字符串转对象转换不全的问题
之所以转换不全,可以确定,应该javabean中对象属性,与xml字符串字段不匹配
java对象的结构如下
第一层

@Data
@XStreamAlias("business")
public class RespInvoiceIssue026295Bean extends BusinessBean implements ResponseBean<RespBodyBean> {


	private RespInvoiceIssueBody026295Bean body;

	public RespInvoiceIssue026295Bean() {
		super();
	}

	public RespInvoiceIssue026295Bean(String id) {
		super(id);
	}

	public RespInvoiceIssue026295Bean(String id, String comment) {
		super(id, comment);
	}

}

第二层

@XStreamAlias("body")
public class RespInvoiceIssueBody026295Bean extends RespBodyBean implements Serializable {


第三层

@Data
public class RespInvoiceIssue026295ReturnData implements Serializable {

2.2 双下划线问题
看下面注释

    public static String toXml(Object obj) {
//        XStream xstream = new XStream(new DomDriver(encoding));
        XStream xstream = new XStream(new Xpp3Driver(new NoNameCoder())); // 解决xml双下划线的问题

        //            XStream xstream=new XStream(new DomDriver()); //直接用jaxp dom来解释
        //            XStream xstream=new XStream(new DomDriver("utf-8")); //指定编码解析器,直接用jaxp dom来解释
        //如果没有这句,xml中的根元素会是<包.类名>;或者说:注解根本就没生效,所以的元素名就是类的属性
        xstream.processAnnotations(obj.getClass()); //通过注解方式的,一定要有这句话
        return xstream.toXML(obj);
    }

2.1 复杂对象转换的问题
一般的复杂结构还不会有问题,但是老式的默认却不行,很奇怪。
跟踪代码调试,发现有一个被解释为String类型了
xml对象与字符串互换,岁月云——Web系统最佳实践,xml,xstream,jibx
看看我的结构
第一层


@Data
@XStreamAlias("business")
public class ReqInvoiceIssue026Bean extends BusinessBean implements RequestBean {

	/**
	 *
	 */
	private static final long serialVersionUID = 279889115759202804L;

	@XStreamAlias("REQUEST_COMMON_FPKJ")
	private ReqInvoiceIssueBody026Bean body;

第二层

@Data
@XStreamAlias("REQUEST_COMMON_FPKJ")
public class ReqInvoiceIssueBody026Bean implements Serializable {

	/**
	 *
	 */
	private static final long serialVersionUID = 7806868114280462342L;

	@XStreamAlias("class")
	@XStreamAsAttribute
	private String cls = "REQUEST_COMMON_FPKJ";


	@XStreamAlias("COMMON_FPKJ_FPT")
	private ReqInvoiceIssueFyxm026Bean fyxm;

	@XStreamAlias("COMMON_FPKJ_XMXXS")
	private ReqInvoiceIssueFyxmGroup026Bean xmxxs;
}

第三层,到了第三层的时候,解析失败。

@Data
@XStreamAlias("COMMON_FPKJ_XMXXS")
public class ReqInvoiceIssueFyxmGroup026Bean implements Serializable {

    @XStreamAlias("class")
    @XStreamAsAttribute
    private String cls = "COMMON_FPKJ_XMXX";
    @XStreamAsAttribute
    private Integer size;
    @XStreamImplicit(itemFieldName = "COMMON_FPKJ_XMXX")
    private List<ReqInvoiceIssueFyxmGroupXmxx026Bean> xmxx;

第四层

@Data
public class ReqInvoiceIssueFyxmGroupXmxx026Bean implements Serializable {

异常信息如下:


com.thoughtworks.xstream.converters.ConversionException: 
---- Debugging information ----
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : COMMON_FPKJ_XMXX
class               : com.whty.einv.sks.model.params.req.body.ReqInvoiceIssueBody026Bean
required-type       : com.whty.einv.sks.model.params.req.body.ReqInvoiceIssueBody026Bean
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
path                : /business/REQUEST_COMMON_FPKJ/COMMON_FPKJ_XMXXS
line number         : 32
class[1]            : com.whty.einv.sks.model.params.req.business.ReqInvoiceIssue026Bean
required-type[1]    : com.whty.einv.sks.model.params.req.business.ReqInvoiceIssue026Bean
version             : 1.4.20
-------------------------------

	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:81)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:68)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:499)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:425)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:277)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:74)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:72)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:68)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:52)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:136)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1464)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1441)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1321)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1312)
	at com.whty.einv.sks.model.util.XmlUtil.toBean(XmlUtil.java:53)
	at com.whty.einv.sks.model.test.TestJavaToXml.toBean(TestJavaToXml.java:108)
	at com.whty.einv.sks.model.test.TestJavaToXml.test10_026(TestJavaToXml.java:86)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220)
	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: COMMON_FPKJ_XMXX
	at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:81)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:420)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:277)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:74)
	... 40 more


Process finished with exit code -1

经过多轮尝试,问题的根源在@XStreamAlias("class"),这个class是不是跟什么冲突了。
xml对象与字符串互换,岁月云——Web系统最佳实践,xml,xstream,jibx
找到问题了,问题也将迎刃而解。

        //注意:不是new Xstream(); 否则报错:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactory
//        XStream xstream = new XStream();
        XStream xstream = new XStream(new Xpp3Driver(new NoNameCoder())); // 解决xml双下划线的问题
        // 去掉class属性
        xstream.aliasSystemAttribute(null,"class");
        //解决XStream的安全警告
        xstream.addPermission(AnyTypePermission.ANY);
//        XStream.setupDefaultSecurity(xstream);
        xstream.allowTypes(new Class[]{cls});
        //扫描注解
        xstream.processAnnotations(cls);
        T obj = (T) xstream.fromXML(xmlStr);
        return obj;

.1 jibx实现
先看依赖,使用这个技术比较麻烦一点,就是再打包的时候要执行mvn jibx:bind

  <dependency>
            <groupId>org.jibx</groupId>
            <artifactId>jibx-run</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.jibx</groupId>
            <artifactId>jibx-extras</artifactId>
            <version>1.3.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.jibx</groupId>
            <artifactId>jibx-tools</artifactId>
            <version>1.3.1</version>
            <scope>test</scope>
        </dependency>

再看打包

<build>
        <plugins>
            <!-- 源码插件 -->
            <plugin>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <attach>true</attach>
                </configuration>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.jibx</groupId>
                <artifactId>jibx-maven-plugin</artifactId>
                <version>1.3.1</version>
                <configuration>
                    <schemaBindingDirectory>src/main/resources</schemaBindingDirectory>
                    <includeSchemaBindings>
                        <!-- 每次执行前需要先mvn clean compile test-compile或手动删除Jibx生成的文件,再执行mvn jibx:bind,有相同类名时,一次性会执行失败  -->
                        <!-- jibx生成的所有类文件会位于第一个生成的类的同目录下,分开执行可以在不同的文件夹生成对应类 -->
                        <includeSchemaBindings>binding/request/*-binding.xml</includeSchemaBindings>
                        <includeSchemaBindings>binding/response/*-binding.xml</includeSchemaBindings>
                    </includeSchemaBindings>
                    <verbose>true</verbose>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>bind</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

使用如下文章来源地址https://www.toymoban.com/news/detail-655126.html

	/**
	 * obj转xml
	 *
	 * @param obj
	 * @param indent 格式化缩进
	 * @return String
	 * @throws JiBXException
	 */
	public static String toXml(Object obj, int indent) throws JiBXException {
		IBindingFactory bfact = BindingDirectory.getFactory(obj.getClass());
		IMarshallingContext mctx = bfact.createMarshallingContext();
		mctx.setIndent(indent);

		StringWriter writer = new StringWriter();
		mctx.marshalDocument(obj, encoding, null, writer);
		return writer.toString();
	}

	/**
	 * xml转obj
	 *
	 * @param xml
	 * @param clazz
	 * @return
	 * @throws JiBXException
	 */
	public static <T> T fromXml(String xml, Class<T> clazz) throws JiBXException {
		IBindingFactory bfact = BindingDirectory.getFactory(clazz);
		IUnmarshallingContext uctx = bfact.createUnmarshallingContext();
		Object obj = uctx.unmarshalDocument(new StringReader(xml), null);
		return clazz.cast(obj);
	}

到了这里,关于xml对象与字符串互换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • jquery和php json字符串转数组对象 和 数组对象转json字符串

    要实现从对象转换为 JSON 字符串,使用 JSON.stringify( ) 方法: 要实现从 JSON 转换为对象,使用 JSON.parse() 方法: 数组变字符串 字符串变数组 json转数组   json_decode(  string $json ,  bool $assoc = false ,  int $depth = 512 ,  int $options = 0 ) $json:待解码的 json string 格式的字符串。这个函数

    2024年02月13日
    浏览(122)
  • FOR XML PATH 函数与同一分组下的字符串拼接

    FOR XML PATH 语句是将查询结果集以XML形式展现,通常情况下最常见的用法就是将多行的结果,拼接展示在同一行。 首先新建一张测试表并插入数据: 查询结果如下: 接下来应用FOR XML PATH的查询结果语句如下: 在查询结果中会出现一个可点击的XML链接,点击后结果如下: 可见

    2024年01月23日
    浏览(66)
  • fastJSON 字符串转对象

    一、fastJSON 包 二、转普通对象 自定义对象A 三、转带泛型对象 包括一层泛型、多层泛型

    2024年02月22日
    浏览(31)
  • 【JavaScript速成之路】JavaScript内置对象--字符串对象

    📃个人主页:「小杨」的csdn博客 🔥系列专栏:【JavaScript速成之路】 🐳希望大家多多支持🥰一起进步呀! 📜前言:小杨在上一篇带着大家一起学习了JavaScript中的内置的数组对象,想必大家对JavaScript的内置的数组对象已经有所了解了,那么今天我们将继续带着大家学习一

    2023年04月10日
    浏览(47)
  • js中的内置对象、数学对象、日期对象、数组对象、字符串对象

    car、computer div、p window、console 数学对象 Math (object类型) 1、圆周率 Math.PI 2、向下取整(返回值) Math.floor() 3、向上取整(返回值) Math.ceil() 4、四舍五入 Math.round() 5、随机数 0x1 Math.random() 6、绝对值 Math.abs() 7、最大值 Math.max() 8、最小值 Math.min() 9、指数幂 Math.pow(底数,指数) 10、平

    2024年01月24日
    浏览(44)
  • Redis数据结构与对象-字符串对象SDS

    Redis没有使用C的字符串,而是自己构建了简单动态字符串(Simple Dynamic String),简称SDS。通过这种字符串格式能够对redis字符串操作进行提速。下面介绍原理。 sds数据格式如下: 比如,一个sds 中存的是 “Redis” ,那么buf 中是一个char型的数组,存5个字符R, e,d,i,s len =5;free

    2023年04月16日
    浏览(47)
  • 【JavaSE专栏89】Java字符串和XML数据结构的转换,高效灵活转变数据

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了 XML 的概念,以及 Java 中 XML 和字符串的转换方法,并给出了样例代码。

    2024年02月09日
    浏览(58)
  • 如何将JSON字符串转化成对象

    在这里只能使用ObjiectMapper这个类才能将Json字符串转成对象的格式进行输出 话不多说,直接上代码 注意事项: json字符串只能匹配上实体类里面定义的属性,没有被定义的属性是无法进行匹配赋值的

    2024年02月13日
    浏览(49)
  • 在 Python 中将对象转换为字符串

    使用 str() 类将对象转换为字符串,例如 result = str(my_object) 。 str() 类返回给定对象的字符串版本。 第一个示例使用 str() 类将对象转换为字符串。 str 类接受一个对象并返回该对象的字符串版本。 如果需要将类对象转换为字符串,请实现 __str__() 方法。 使用 __str__() 方法将对象

    2024年02月08日
    浏览(69)
  • JAVA 字符串JSON Map 对象转化

    目录 字符串转JSON JSON 转字符串 json字符串转map 将map转成json字符串 map转对象 将对象转化成map 将对象转化成JSON Json转对象 方式一 第一步 将map 转成json字符串对象 第二步 将json字符串对象转化成对象 第一步 将对象转化成json字符串 第二步 将JSON字符串转成map 方法一:fastjson转

    2024年02月15日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包