对于一个项目,我被迫使用某些网络服务。我创建了一个小的java项目,除了打开正确的httpconnection,写入输入并获取输出之外什么都不做。此输出通常是xml文本或json文本。我现在想知道如何将此文本转换为java对象。
我可以通过使用以下OOP方案手动完成:当调用webservice时,如果它有输出,那么" handler"必须提供课程。此处理程序类必须符合此接口:
public interface Handler<T>
{
public T handle(Byte[] webserviceOutput)
}
特定XML案例的辅助类:
public abstract class XMLHandler<T> implements handler<T>
{
public T handle(Byte[] webserviceOutput)
{
Document xmldoc = convertByteArrayToDocument();
return parseXmlDoc(xmlDoc);
}
public abstract T parseXmlDoc(Document xmlDoc);
}
我喜欢这个界面有多干净,但是实际的实现非常不干净,并且所有涉及解析整个输入,一行一行并手动调用很多setter(换句话说:不使用反射)。
另一方面,存在将json和xml转换为现有java对象的库。它们的主要缺点是它们非常不灵活,因为字段的名称必须与xml中的字段完全匹配。处理疯狂的dba时,这是一个负担,他们将所有字段缩写为乱码(例如字段&#39; apb&#39;应该命名为&#39; adjustablePersonBudget&#39;)。另一个问题是autio-conversions往往是冗长的。例如,xml
<books>
<book></book>
<book></book>
...
</books>
导致java in:
rootObject.getBooks().getBookList()
而非rootObject.getBookList()
使用库的明显优势是你不需要转换类和反射。
对于这两种企业软件方法,您有什么经验和想法?
答案 0 :(得分:0)
如果你有一个XML模式,JAXB很不错 - 作为JDK的一部分。通过运行例如生成java类xjc -p foo myschema.xsd
读取XML文件并返回一个对象(来自xjc工具生成的类):
JAXBContext context = JAXBContext.newInstance(FooObj.class);
Unmarshaller unMarshaller = context.createUnmarshaller();
FooObj param = (FooObj) unMarshaller.unmarshal(new FileInputStream("Foo.xml"));
如果您只想将XML文档的某些部分转换为对象,则可以执行类似的操作,例如,能够为JAXB提供部分DOM文档,而不是如上所述的整个文件。 你可以在这里查看Converting XML to Java objects
答案 1 :(得分:0)
要问自己的一个问题是:你真的需要Java吗?所谓的&#34; XRX&#34;哲学是通过使用XQuery,XSLT和XForms等语言和工具将数据保持在端到端的XML模型中。正如您所发现的那样,将数据从一种格式转换为另一种格式最终可能只是项目工作的一半,如果可以的话,它值得避免。