我知道这不是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");
会导致:
<root>
<entity att="fooattrib"/>
<array><ele att="barattrib">barelement</ele></array>
<array><ele>zoobelement</ele></array>
</root>
答案 0 :(得分:2)
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表达式,这样一种愚蠢的方法会出错。< / p>
我考虑过的另一种方法虽然没有实现(上面的“足够好”),但是如果它还不存在的话,就是使用优秀的Jaxen生成不存在的元素。
来自Jaxen FAQ:
唯一需要的是org.jaxen.Navigator接口的实现。并非所有接口都是必需的,并且还提供了org.jaxen.DefaultNavigator形式的默认实现。
DOMWriterNavigator
将换行并存在DOMNavigator
,如果该元素不存在,则使用makeElement
方法。但是,即使采用这种方法,
你可能不得不为attributes
和text()
函数等事情做一些XPath查询的前/后处理。
答案 1 :(得分:2)
我能想到的最好的方法是使用JAXB实现,它将对象编组/解组为xml然后我使用Dozer(http://dozer.sourceforge.net/documentation/mapbackedproperty.html)来实现将映射中的键的xpath映射到JAXB对象方法setter。
<mapping type="one-way" map-id="TC1">
<class-a>java.util.Map</class-a>
<class-b>org.example.Foo</class-b>
<field>
<a key="root/entity/@att">this</a>
<b>Foo.entity.att</b>
<a-hint>java.lang.String</a-hint>
</field>
这更像是一个两步解决方案,但真的对我有用。
答案 2 :(得分:2)
我也想要同样的要求,其中自然是如此动态,不想使用XSLT或任何对象映射框架,所以我已经在java中实现了这个代码并在其上写了博客,请访问,
http://ganesh-kandisa.blogspot.com/2013/08/dynamic-xml-transformation-in-java.html
或git repository的fork代码,