【问题标题】:JAVA: Build XML document using XPath expressionsJAVA:使用 XPath 表达式构建 XML 文档
【发布时间】:2008-11-20 21:09:25
【问题描述】:

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

【问题讨论】:

标签: java xml xpath


【解决方案1】:

几年前我在寻找类似的东西——一种可写的 XPath。最后,在没有找到任何东西的情况下,我通过向 parent 表达式添加新节点来破解基本上构建 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.DefaultNavigator。

DOMWriterNavigator 将包装现有的DOMNavigator,然后在元素不存在时使用makeElement 方法。然而,即使采用这种方法, 对于attributestext() 等函数,您可能需要对XPath 查询进行一些前/后处理。

【讨论】:

    【解决方案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>
    

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

    【讨论】:

      【解决方案3】:

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

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

      或者在 git 仓库中 fork 代码,

      https://github.com/TheGanesh/DynamicXMLTransformer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多