如何在Java Spring Boot中将XML转换为对象?

6

你好,我正在尝试转换具有多个对象的XML文件,但是出现了错误消息:文档中根元素后面的标记必须格式良好。

XML:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="test.example.com">
  <Item>
    <ItemKey>1111</ItemKey>
    <Start>2/10/2017</Start>
    <customNumber>12</customNumber>
    <End>2/10/2018</End>
    <Account>2221111</Account>
    <Name>John</Name>
    <Note>GOOD</Note>
    <CodeNo>4444-1</CodeNo>
    <Source>www.cnn.com</Source>
  </Item>
  <Item>
    <ItemKey>2222</ItemKey>
    <Start>2/10/2017</Start>
    <customNumber>75</customNumber>
    <End>2/10/2018</End>
    <Account>3333111</Account>
    <Name>Smith</Name>
    <Note>NOT GOOD</Note>
    <CodeNo>4444-2</CodeNo>
    <Source>www.fox.com</Source>
  </Item>
</string>

模型类:

package example.models;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Item")
public class Model {

private String CodeNo;

private String ItemKey;

private String Start;

private String End;

private String Account;

private String Name;

private String Note;

...(gets and sets)

主要代码:

StringReader reader = new StringReader(response);
String response = restTemplate.getForObject(url, String.class);
...

 JAXBContext jaxbContext = JAXBContext.newInstance(Model.class);
            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
            Model recordes = (Model) unmarshaller.unmarshal(reader);

反序列化异常:文档中根元素后的标记必须格式良好。

XML中只有一个项目时,代码可以工作。

我漏掉了什么并需要做什么才能获得元素(项)对象列表而不出现错误?

4个回答

4
在XML文件中,根元素是<string xmlns="test.example.com">标签,因此要么更正XML,要么更正模型类才能让它正常工作。
要了解更多关于错误的信息,请查看此链接:如何修复错误:文档中跟随根元素的标记必须格式正确 编辑 您可以使用此工具生成POJO:http://pojo.sodhanalibrary.com 以下是上述XML的POJO类:
public class MyXML
{
    private String string; // Change the class as String is Wrapper class

    public String getString ()
    {
        return string;
    }

    public void setString (String string)
    {
        this.string = string;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [string = "+string+"]";
    }
}

String类:

public class String // Change this className as String is Wrapper class in java
{
    private Item[] Item;

    private String xmlns;

    public Item[] getItem ()
    {
        return Item;
    }

    public void setItem (Item[] Item)
    {
        this.Item = Item;
    }

    public String getXmlns ()
    {
        return xmlns;
    }

    public void setXmlns (String xmlns)
    {
        this.xmlns = xmlns;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [Item = "+Item+", xmlns = "+xmlns+"]";
    }
}

Items class

public class Item
{
    private String Name;

    private String Source;

    private String End;

    private String CodeNo;

    private String Start;

    private String Account;

    private String ItemKey;

    private String Note;

    private String customNumber;

    public String getName ()
    {
        return Name;
    }

    public void setName (String Name)
    {
        this.Name = Name;
    }

    public String getSource ()
    {
        return Source;
    }

    public void setSource (String Source)
    {
        this.Source = Source;
    }

    public String getEnd ()
    {
        return End;
    }

    public void setEnd (String End)
    {
        this.End = End;
    }

    public String getCodeNo ()
    {
        return CodeNo;
    }

    public void setCodeNo (String CodeNo)
    {
        this.CodeNo = CodeNo;
    }

    public String getStart ()
    {
        return Start;
    }

    public void setStart (String Start)
    {
        this.Start = Start;
    }

    public String getAccount ()
    {
        return Account;
    }

    public void setAccount (String Account)
    {
        this.Account = Account;
    }

    public String getItemKey ()
    {
        return ItemKey;
    }

    public void setItemKey (String ItemKey)
    {
        this.ItemKey = ItemKey;
    }

    public String getNote ()
    {
        return Note;
    }

    public void setNote (String Note)
    {
        this.Note = Note;
    }

    public String getCustomNumber ()
    {
        return customNumber;
    }

    public void setCustomNumber (String customNumber)
    {
        this.customNumber = customNumber;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [Name = "+Name+", Source = "+Source+", End = "+End+", CodeNo = "+CodeNo+", Start = "+Start+", Account = "+Account+", ItemKey = "+ItemKey+", Note = "+Note+", customNumber = "+customNumber+"]";
    }
}

如何为Spring Boot模型添加xmlns? - Mr K
@MrK,我修改了我的回答,你是在寻找其他的东西吗? - smali
好的,我需要将其与以下内容结合使用: JAXBContext jaxbContext = JAXBContext.newInstance(Model.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); Model recordes = (Model) unmarshaller.unmarshal(reader); - Mr K

3

逐步创建Springboot中XML到对象的过程

  1. 首先,您需要创建Maven项目并给定Group id和Artifact id。

2.在src/main/java中创建您的Java类,包括您的包名称和Java类名称,例如XmlToJavaObject.java。

3.使用以下链接将您的XML代码转换为POJO类。

http://pojo.sodhanalibrary.com/Convert

它将根据您的XML数据创建POJO类。创建一个POJO包并将所有POJO类放入此文件夹中。

  1. 将XML文件放置在靠近pom.xml的项目中。

  2. 在XmlToJavaObject.java类中创建main方法。

我写了下面的代码,但您可以根据自己的要求进行更改。

我们的示例XML是

<?xml version="1.0" encoding="UTF-8"?>
      <Student>
        <id>1111</id>
        <name>Ravi</name>
        <age>12</age>
        <dob>2/10/2008</dob>
    </Student>

我们的模型类

import javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement
        public class Student
        {
            private String dob;

            private String name;

            private String id;

            private String age;

            public String getDob ()
            {
                return dob;
            }

            public void setDob (String dob)
            {
                this.dob = dob;
            }

            public String getName ()
            {
                return name;
            }

            public void setName (String name)
            {
                this.name = name;
            }

            public String getId ()
            {
                return id;
            }

            public void setId (String id)
            {
                this.id = id;
            }

            public String getAge ()
            {
                return age;
            }

            public void setAge (String age)
            {
                this.age = age;
            }

            @Override
            public String toString()
            {
                return "ClassPojo [dob = "+dob+", name = "+name+", id = "+id+", age = "+age+"]";
            }
        }

我们的主要类示例
import java.io.File;
import javax.xml.bind.JAXBContext;  
import javax.xml.bind.JAXBException;  
import javax.xml.bind.Unmarshaller;

import com.test.pojo.Student;


public class XmlToJavaObject {


    public static void main(String ar[])
    {
         try {  

                File file = new File("Student.xml");  
                JAXBContext jaxbContext = JAXBContext.newInstance(Student.class);  

                Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  
                Student student= (Student) jaxbUnmarshaller.unmarshal(file);  


                System.out.println(student.getName());


              } catch (JAXBException e) {  
                e.printStackTrace();  
              }
    }
}

输出

Ravi

谢谢,使用 @XmlRootElement 可以使所有嵌套对象自动转换。 - Renan Ribeiro


-1
int PRETTY_PRINT_INDENT_FACTOR = 4;
String TEST_XML_STRING =
        "<?xml version=\"1.0\" ?><test attrib=\"moretest\">Turn this to 
JSON</test>";

try {
     JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
     String jsonPrettyPrintString = 
xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
     System.out.println(jsonPrettyPrintString);
} catch (JSONException je) {
     System.out.println(je.toString());
}

希望这能对你有所帮助,使用org.json jar文件


我需要对象而不是 JSON,有什么建议吗? - Mr K
Object obj = (Object)xmlJSONObj; 对象 obj = (Object)xmlJSONObj; - Gokul raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接