Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单、结构化的XML数据绑定(无代码生成或反射)_Java_Xml Serialization_Xsd - Fatal编程技术网

Java 简单、结构化的XML数据绑定(无代码生成或反射)

Java 简单、结构化的XML数据绑定(无代码生成或反射),java,xml-serialization,xsd,Java,Xml Serialization,Xsd,我正在寻找一个Java库,它允许我将XML封送到Java对象树,反之亦然。有很多库允许我将XML绑定到一些代码生成工具生成的JavaBean,但是,我不需要这些库(JAXB、JiBX、Castor等等) 我需要的是一个工具,它将使用一个模式文件和一个xml文件,然后以类似的方式返回Maps、Lists和Objects的组合(当然,如果可能的话)。Jackson用于JSON,而不是XML;而且它缺乏考虑模式文件的能力(因为JSON模式目前还太不成熟) 我可以调整一些现有的工具来解决我的问题,还是应

我正在寻找一个Java库,它允许我将XML封送到Java对象树,反之亦然。有很多库允许我将XML绑定到一些代码生成工具生成的JavaBean,但是,我不需要这些库(JAXB、JiBX、Castor等等)

我需要的是一个工具,它将使用一个模式文件和一个xml文件,然后以类似的方式返回
Map
s、
List
s和
Object
s的组合(当然,如果可能的话)。Jackson用于JSON,而不是XML;而且它缺乏考虑模式文件的能力(因为JSON模式目前还太不成熟)

我可以调整一些现有的工具来解决我的问题,还是应该用DOM和XSOM推出我自己的解决方案?

看起来像SOAP。
一个选项是ApacheAxis(我们经常使用它),但还有其他实现。

MOXy的动态JAXB

MOXy提供了一个动态JAXB实现。您可以从XML模式引导,而不是静态类,您可以使用通用的get/set方法与DynamicEntity实例交互:

FileInputStream xsd = new FileInputStream("src/example/customer.xsd");
DynamicJAXBContext jaxbContext = 
    DynamicJAXBContextFactory.createContextFromXSD(xsd, null, null, null);

FileInputStream xmlInputStream = new FileInputStream("src/example/dynamic/customer.xml");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(xmlInputStream);

System.out.println(customer.<String>get("name"));
有关更多信息,请参阅:


我使用JAXB而不生成代码。工作得相当好。与基元类型的值相对应的对象将具有符合模式的类型(即xs:boolean是一个布尔值),复杂类型将表示为映射(可能两个——一个用于属性,一个用于子元素)或映射列表。我不确定这是否可行。XML包含的信息比JSON多得多(例如名称空间、元素和属性),而简单的Java类型不足以表示这一点。即使您的特定XML不使用这些,任何框架都必须支持它们。与JSON和Jackson的比较并不能真正支持.tkr,我无法快速找到如何用JAXB解决问题的方法。你能给我一些指示吗?事实上我没有得到你的要求。对于具有动态属性的运行时相关对象,我不会使用JAXB。可能dom4j、jdom或axiom是正确的选择。它们不提供到对象的映射作为映射。但是节点对象比贴图更糟糕吗?我会考虑JDOM:doc.GooRoToelEngEnter()。GeDebug(“人”)。GETFILD(“名称”)与MAP的地图没有太大的不同。动态实体和SDO看起来像是能完成这项工作的东西。非常感谢。EclipseLink包括MOXy组件,是SDO参考实现,因此它是动态JAXB的良好起点。我建议使用最新的2.1.1版本。它有一些与列表属性相关的错误修复。
FileReader xsd = new FileReader("customer.xsd");
XSDHelper.INSTANCE.define(xsd, null);

FileReader xml = new FileReader("input.xml");
XMLDocument doc = XMLHelper.INSTANCE.load(xml, null, null);

DataObject customerDO = doc.getRootObject();
int id = customerDO.getInt("id");
DataObject addressDO = customerDO.getDataObject("contact-info/address");