JAVA:使用XPath表达式构建XML文档

我知道这不是XPath的真正含义,但如果我有一个XPath表达式的HashMap来评估如何构建XML文档。 我找到了dom-4j的DocumentHelper.makeElement(branch,xpath),除了它无法创建属性或索引。 当然存在可以做到这一点的图书馆?

Map xMap = new HashMap(); xMap.put("root/entity/@att", "fooattrib"); xMap.put("root/array[0]/ele/@att", "barattrib"); xMap.put("root/array[0]/ele", "barelement"); xMap.put("root/array[1]/ele", "zoobelement"); 

会导致:

   barelement zoobelement  

几年前我找了类似的东西 – 一种可写的XPath。 最后,在没有找到任何东西的情况下,我通过向表达式添加新节点来破解基本上构建XML文档的东西:

 parent="/" element="root" parent="/root" element="entity" parent="/root/entity" attribute="att" value="fooattrib" parent="/root" element="array" parent="/root" element="ele" text="barelement" 

(这本身是由XML配置文件管理的,因此出现在上面。)

尝试自动化其中一些只是采取最后一个路径元素并制作它的东西是很诱人的,但我总觉得有一些XPath表达式我可以编写这样一个愚蠢的方法会出错。

我考虑的另一种方法,虽然没有实现(上面的“足够好”),但是如果它还没有存在的话,就是使用优秀的Jaxen来生成不存在的元素。

来自Jaxen FAQ :

唯一需要的是接口org.jaxen.Navigator的实现。 并非所有接口都是必需的,并且还提供了org.jaxen.DefaultNavigatorforms的默认实现。

DOMWriterNavigator将包装和现有DOMNavigator ,然后如果元素不存在则使用makeElement方法。 但是,即使使用这种方法,您可能还必须对attributestext()函数之类的内容进行XPath查询的一些前/后处理。

我能想到的最好的是使用JAXB实现,它将对象编组/解组为xml然后我使用Dozer(http://dozer.sourceforge.net/documentation/mapbackedproperty.html)来映射xpath这是JAXB对象方法设置器的映射中的键。

  java.util.Map org.example.Foo  this Foo.entity.att java.lang.String  

这更像是一个两步解决方案,但真的对我有用。

我也想要同样的要求,其中自然是如此动态,不想使用XSLT或任何对象映射框架,所以我已经在java中实现了这个代码,并在其上写了博客,请访问,

http://ganesh-kandisa.blogspot.com/2013/08/dynamic-xml-transformation-in-java.html

或git存储库中的fork代码,

https://github.com/TheGanesh/DynamicXMLTransformer