我使用JAXB创建文件夹和文件层次结构
我的模特:
@XmlRootElement
public class Root {
@XmlAttribute
private String path;
@XmlElement(name = "dir")
private ArrayList<Dir> rootContentDirs = null;
@XmlElement(name = "file")
private ArrayList<FileObj> rootContentFiles = null;
public void setRootContentDirs(ArrayList<Dir> rootContentDirs) {
this.rootContentDirs = rootContentDirs;
}
public void setRootContentFiles(ArrayList<FileObj> rootContentFiles) {
this.rootContentFiles = rootContentFiles;
}
public void setPath(String path) {
this.path = path;
}
}
public class Dir {
@XmlAttribute
private String name;
@XmlElement(name = "dir")
private ArrayList dirs = null;
@XmlElement(name = "file")
private ArrayList files = null;
public void setName(String name) {
this.name = name;
}
public void setDirs(ArrayList dirs) {
this.dirs = dirs;
}
public void setFiles(ArrayList files) {
this.files = files;
}
}
public class FileObj{
@XmlAttribute
private String name;
@XmlAttribute
private long size;
@XmlAttribute
private String type;
public void setName(String name) {
this.name = name;
}
public void setSize(long size) {
this.size = size;
}
public void setType(String type) {
this.type = type;
}
}
我想制作目录和文件树:
public class XmlByJaxb extends Generator {
private static final String JAXB_XML = "./jaxb.xml";
private static Root root = null;
@Override
public void output() throws IOException {
JAXBContext context = null;
Marshaller m = null;
try {
context = JAXBContext.newInstance(Root.class, Dir.class, FileObj.class);
m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(root, new File(JAXB_XML));
} catch (JAXBException e) {
}
}
@Override
public void run() {
ArrayList<FileObj> rootFiles = addFiles(dir);
ArrayList<Dir> rootDirs = make(dir);
root = new Root();
root.setPath(dir.getPath());
root.setRootContentFiles(rootFiles);
root.setRootContentDirs(rootDirs);
/.../
}
但是我在生成的xml中有一个奇怪的“ xsi:type”和“ xmlns:xsi”:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root path="/home/phlamey/IdeaProjects/FileUtillite">
<dir name="src">
<dir xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="dir" name="test">
<dir xsi:type="dir" name="java">
/.../
所以我的问题是:这是什么意思,如何删除?
在您的Dir
类中,您没有指定集合的类型,这就是JAXB添加xsi:type
属性的原因。
你有:
@XmlElement(name = "dir")
private ArrayList dirs;
如果您ArrayList
要包含的实例,Dir
则可以执行以下操作:
@XmlElement(name = "dir")
private ArrayList<Dir> dirs = null;
如果由于某种原因您不想在集合中指定类型,则可以在@XmlElement
批注中进行指定:
@XmlElement(name = "dir", type=Dir.class)
private ArrayList dirs = null;
但是我在生成的XML中有奇怪的“xsi:type”和“xmlns:xsi”: 所以我的问题是:这是什么意思,如何删除它?
在代码中创建了这些类的实例之后,我调用了传递所需值的setter方法。尽管该方法的参数是Object,但其值最有可能是字符串(我无法控制它是如何定义的)。但是,为了保持一致,我将字符串转换为Object,以便它与方法的参数类型匹配。代码如下所示: 当我对Java对象进行整理时,我会在结果XML中得到以下内容,就在字符串值的前面: 我读过关于方法的参数类型和传递给它的数据类型不匹配的文章。在我的例子
问题内容: 使用JAXB时,我想在使用泛型时从XML元素中删除多余的名称空间/类型。我该怎么办或我做错了什么?我想使用泛型,这样我只需要编写一次代码块。 示例代码: 输出: 问题答案: 通用测试 您的JAXB(JSR-222)实现将为每个类创建映射(即,不是type(即)。因此,它将字段视为type 。这将导致属性,因为JAXB实现正在添加足够的信息才能解组相同的类型。 演示版 下面是您可以使用的
问题内容: 我使用XJC工具为XSD架构生成Java类。当我使用JAXB Marshaller将类编组为XML有效负载时,我在输出XML中缺少“ schemaLocation”参数,但在xsd文件中声明了此参数。如何在输出XML中强制执行“ schemaLocation”参数? 以下是用于代码生成的xsd模式文件的开头: 问候 问题答案: 试试这个:
问题内容: 我正在使用JAXB动态生成XML。 现在,我想使用XSL将其转换为HTML。我该如何包括 在动态生成的XML中? 问题答案: 这里的所有解决方案都非常丑陋和冗长。只需在Mashaller对象内部设置一行即可指定其他标题。 本示例将使用样式表将对象输出到文件,并很好地格式化元素以供人类阅读。该对象属于类,并将被写入file,并由给出的样式表设置格式: 更新资料 在最新版本的JAXB中,我