8

我知道这并不是 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>
4

3 回答 3

2

几年前我寻找过类似的东西——一种可写的 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 常见问题解答

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

DOMWriterNavigatorwrap 和 existing DOMNavigator,然后makeElement在元素不存在时使用该方法。但是,即使使用这种方法,您也可能必须对诸如attributestext()函数之类的 XPath 查询进行一些前/后处理。

于 2008-11-24T16:40:22.093 回答
2

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

<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>

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

于 2012-06-21T18:23:58.487 回答
2

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

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

或在 git 存储库中分叉代码,

https://github.com/TheGanesh/DynamicXMLTransformer

于 2013-08-28T03:30:46.383 回答