【问题标题】:how convert xml to object on java spring-bootjava - 如何在java spring-boot上将xml转换为对象
【发布时间】:2018-05-22 07:13:29
【问题描述】:

你好,我正在尝试将 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 只有一项代码可以工作。

我缺少什么并且需要做什么才能正确获取元素(项目)对象列表?

【问题讨论】:

    标签: java xml object spring-boot


    【解决方案1】:

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

    1. 首先,您需要创建 maven 项目,并提供 Group id 和 Artifact id。

    2.在 src/main/java 中创建您的 java 类,并为 Example-XmlToJavaObject.java 创建您的包名和 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 它可以转换所有嵌套对象本身
    【解决方案2】:

    在 XML 文件中,您的根元素是 &lt;string xmlns="test.example.com"&gt; 标记,因此请更正 XML 或更正 Model 类以使其正常工作。

    要了解有关错误的更多信息,请查看How to fix error: The markup in the document following the root element must be well-formed

    编辑

    您可以使用此工具生成 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+"]";
        }
    }
    

    字符串类:

    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+"]";
        }
    }
    

    物品类

    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+"]";
        }
    }
    

    【讨论】:

    • 我需要如何将 xmlns 添加到 spring boot 模型中?
    • @MrK,编辑了我的答案是你在寻找还是别的什么?
    • 好的,我需要如何将它与:JAXBContext jaxbContext = JAXBContext.newInstance(Model.class);解组器 unmarshaller = jaxbContext.createUnmarshaller();模型记录 = (Model) unmarshaller.unmarshal(reader);
    【解决方案3】:
    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,有什么建议吗?
    • 对象 obj=(Object)xmlJSONObj;
    【解决方案4】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2022-11-21
    • 2020-11-21
    • 2019-07-21
    相关资源
    最近更新 更多