দেখে মনে হচ্ছে এখন পর্যন্ত কেউই প্রশ্নের উত্তর দিতে সক্ষম হয়নি :)
আমি বাধ্যতামূলক ক্লাসগুলি গতিশীলরূপে তৈরি করতে এবং তারপরে পুনরাবৃত্তভাবে সীমাবদ্ধ প্রকারগুলি দিয়ে যাবার জন্য EclipseLink এর MOXy ব্যবহার করি। এটি কিছুটা ভারী, তবে একবার বস্ত গাছটি তাত্ক্ষণিকভাবে চালিত হলে এটি এক্সপাথ মান ইনজেকশনটিকে অনুমতি দেয়:
InputStream in = new FileInputStream(PATH_TO_XSD);
DynamicJAXBContext jaxbContext =
DynamicJAXBContextFactory.createContextFromXSD(in, null, Thread.currentThread().getContextClassLoader(), null);
DynamicType rootType = jaxbContext.getDynamicType(YOUR_ROOT_TYPE);
DynamicEntity root = rootType.newDynamicEntity();
traverseProps(jaxbContext, root, rootType, 0);
ট্র্যাভার্সপ্রপসগুলি বেশ সহজ পুনরাবৃত্ত পদ্ধতি:
private void traverseProps(DynamicJAXBContext c, DynamicEntity e, DynamicType t, int level) throws DynamicException, InstantiationException, IllegalAccessException{
if (t!=null) {
logger.info(indent(level) + "type [" + t.getName() + "] of class [" + t.getClassName() + "] has " + t.getNumberOfProperties() + " props");
for (String pName:t.getPropertiesNames()){
Class<?> clazz = t.getPropertyType(pName);
logger.info(indent(level) + "prop [" + pName + "] in type: " + clazz);
//logger.info("prop [" + pName + "] in entity: " + e.get(pName));
if (clazz==null){
// need to create an instance of object
String updatedClassName = pName.substring(0, 1).toUpperCase() + pName.substring(1);
logger.info(indent(level) + "Creating new type instance for " + pName + " using following class name: " + updatedClassName );
DynamicType child = c.getDynamicType("generated." + updatedClassName);
DynamicEntity childEntity = child.newDynamicEntity();
e.set(pName, childEntity);
traverseProps(c, childEntity, child, level+1);
} else {
// just set empty value
e.set(pName, clazz.newInstance());
}
}
} else {
logger.warn("type is null");
}
}
সমস্ত কিছুকে এক্সএমএলে রূপান্তর করা বেশ সহজ:
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
debate, arguments, polling, or extended discussion