【问题标题】:How to Convert Java Object to XML object with java keyword如何使用 java 关键字将 Java 对象转换为 XML 对象
【发布时间】:2016-11-28 07:35:55
【问题描述】:

我创建了一个 java 类:

public class ReturnObj {

    private String returncode;
    private String returndesc;
    private Pkg pkg;
    public String getReturncode() {
        return returncode;
    }

    public void setReturncode(String returncode) {
        this.returncode = returncode;
    }

    public String getReturndesc() {
        return returndesc;
    }

    public void setReturndesc(String returndesc) {
        this.returndesc = returndesc;
    }

}

和其他类:

public class Pkg {

    private String packagecode;
    private String cycle;
    private String price;
    private String desc;
    public String getPackagecode() {
        return packagecode;
    }

    public void setPackagecode(String packagecode) {
        this.packagecode = packagecode;
    }

    public String getCycle() {
        return cycle;
    }

    public void setCycle(String cycle) {
        this.cycle = cycle;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

我想将对象 ReturnObj 转换为这个 XML

<return>
    <returncode>1</returncode>
    <returndesc>DANG_KY_THANH_CONG</returndesc>
    <package>
        <packagecode>BD30</packagecode>
        <cycle>1</cycle>
        <price>15000</price>
        <desc> BD30</desc>
    </package>
</return>

那么我如何序列化一个属性 pkg 以封装在 XML 中?因为Java不允许将变量命名为关键字,所以包是Java中的关键字!

【问题讨论】:

  • 您使用什么来生成 XML?有很多工具可以做到这一点。我们不知道您选择了哪一个。
  • 没有关键字可以让您将 Java 对象转换为 XML。不清楚你在问什么。
  • 通过他/她给出的例子,很清楚 OP 在问什么。 OP想要一个带有xml元素名称“package”的输出,这是Java中的一个关键字,因此不允许作为变量名
  • @sharonbn 唯一清楚的是,OP 要求基于不存在的 Java 关键字的解决方案。
  • @EJP,如果我的评论没有澄清,我看不出我还能做什么。但是,“包”确实是一个 Java 关键字,确实不允许作为变量名。

标签: java xml serialization


【解决方案1】:

您可以在您的课程中使用JAXB marshling,它将对象转换为 XML,这里是帮助您的链接JAXB Marshling

【讨论】:

  • 那没有给出答案。问题不在于如何将对象转换为 XML
  • @sharonbn 这是一个很好的解决方案(带有注释的JAXB),当在注释中明确声明名称时,如@XmlElement("package")
  • 所以也许答案需要包含那一点信息
  • @sharonbn 你真的认为,我们应该编写完整的代码并为问题或任何给定的问题提供完整的解决方案,以便有问题的人朝那个方向看并由她解决/他自己?
  • @HimanshuMishra,是的,我们应该编写完整的代码,或者至少对特定问题给出完整的答案。这是本网站的意图。 SO不是学校/培训的地方。无论如何,您的回答可以满足与 XML 编组相关的所有个问题。肯定是太宽泛了。
【解决方案2】:

试试xstream

XStream xstream = new XStream();
xstream.alias("package", Pkg.class);
String xml = xstream.toXML(myReturnObj);

【讨论】:

    【解决方案3】:

    您可以使用 java 自带的 JAXB API 将 java 对象转换为 XML。

    以下是可以解决您的要求的代码。

    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "return")
    public class ReturnObj {
    
        private String returncode;
        private String returndesc;
        private Pkg pkg;
    
        public Pkg getPkg() {
            return pkg;
        }
    
        @XmlElement(name = "package")
        public void setPkg(Pkg pkg) {
            this.pkg = pkg;
        }
    
        public String getReturncode() {
            return returncode;
        }
    
        @XmlElement(name = "returncode")
        public void setReturncode(String returncode) {
            this.returncode = returncode;
        }
    
        public String getReturndesc() {
            return returndesc;
        }
    
        @XmlElement(name = "returndesc")
        public void setReturndesc(String returndesc) {
            this.returndesc = returndesc;
        }
    
    }
       @XmlRootElement
    public class Pkg {
        private String packagecode;
        private String cycle;
        private String price;
        private String desc;
    
        public String getPackagecode() {
            return packagecode;
        }
    
        @XmlElement(name="packagecode")
        public void setPackagecode(String packagecode) {
            this.packagecode = packagecode;
        }
    
        public String getCycle() {
            return cycle;
        }
    
        @XmlElement(name="cycle")
        public void setCycle(String cycle) {
            this.cycle = cycle;
        }
    
        public String getPrice() {
            return price;
        }
    
        @XmlElement(name="price")
        public void setPrice(String price) {
            this.price = price;
        }
    
        public String getDesc() {
            return desc;
        }
    
        @XmlElement
        public void setDesc(String desc) {
            this.desc = desc;
        }
    }    
    
        import java.io.File;
    
        import javax.xml.bind.JAXBContext;
        import javax.xml.bind.JAXBException;
        import javax.xml.bind.Marshaller;
    
        public class JAXBExample {
    
            private static final String FILE_NAME = "C:\\ru\\jaxb-returnObj.xml";
    
            public static void main(String[] args) {
                ReturnObj returnObj = new ReturnObj();
                returnObj.setReturncode("1");
                returnObj.setReturndesc("DANG_KY_THANH_CONG");
                Pkg pkg = new Pkg();
                pkg.setCycle("1");
                pkg.setPrice("15000");
                pkg.setDesc("BD30");
                returnObj.setPkg(pkg);
                jaxbObjectToXML(returnObj);
            }
    
            private static void jaxbObjectToXML(ReturnObj emp) {
    
                try {
                    JAXBContext context = JAXBContext.newInstance(ReturnObj.class);
                    Marshaller m = context.createMarshaller();
                    // for pretty-print XML in JAXB
                    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    
                    // Write to System.out, this will print the xml on console
                    m.marshal(emp, System.out);
    
                    // Write to File
                    m.marshal(emp, new File(FILE_NAME));
                } catch (JAXBException e) {
                    e.printStackTrace();
                }
            }
    
        }
    

    说明:

    @XmlRootElement:这是要在 JAXB 中使用的 Object 的必备注解。它定义了 XML 内容的根元素。

    @XmlElement:这将创建元素。如果您想在将 java 对象转换为 xml 时为 xml 元素指定其他名称,则可以将 name 属性传递给 @XmlElement 示例:

    @XmlElement(name = "package")
    

    执行上面的代码查看想要的输出。

    快乐编码。

    【讨论】:

    • 以及如何将 pkg 变量序列化为“包”xml 元素?也许您的示例可以包含特别要求的这一关键信息?
    • 如果要将 pkg 变量序列化为“package”xml 元素,请在 ReturnObj 类的 setPkg 方法上的 XmlElement 注释中提供 name =“package”。使用 XmlElement 中提供的名称属性,您可以将 java 变量重命名为其他名称,然后该名称将在 XML 中使用。我已经编辑了上面的代码。它将生成您正在寻找的确切 XML。还为上述代码添加输出。
    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多