2011-09-27 64 views
3

由于XML例子:如何通过XPath将XML映射到Java对象?

<fooRoot> 
    <bar> 
    <lol>LOLOLOLOL</lol> 
    </bar> 
    <noob> 
    <boon> 
     <thisIsIt></thisIsIt> 
    </boon> 
    </noob> 
</fooRoot> 

哪些应该被映射到:

class MyFoo { 
    String lol; 
    String thisIsIt; 
    Object somethingUnrelated; 
} 

约束:

  • XML不应该改变,它提供了一个解析org.w3c .dom.Document对象。
  • 类不会,也不会将1:1映射到XML。
  • 我只想将XML的特定路径映射到对象的特定字段。

我的梦想的解决办法是这样的:

@XmlMapped 
class MyFoo { 

    @XmlElement("/fooRoot/bar/lol") 
    String lol; 

    @XmlElement("/noob/boon/thisIsIt") 
    String thisIsIt; 

    @XmlIgnore 
    Object somethingUnrelated; 
} 

做任何事情也同样存在?我发现要么是严格的1:1映射(例如JMX,JAXB),要么在所有字段(例如SAX,Commons Digester)上进行手动迭代。

JiBX binding definitions最接近我所渴望的。然而,这个工具是对marshall/unmarshall Java对象的完整层次结构的解释。我只想在运行时将XML文档的一部分提取到现有的Java bean中。

回答

5

注:我是EclipseLink JAXB (MOXy)铅和JAXB 2 (JSR-222)专家小组的成员。

你可以用莫西做到这一点:

@XmlRootElement(name="fooRoot") 
class MyFoo { 

    @XmlPath("bar/lol/text()") 
    String lol; 

    @XmlElement("noob/boon/thisIsIt/text()") 
    String thisIsIt; 

    @XmlTransient 
    Object somethingUnrelated; 
} 

更多信息

+0

好东西,谢谢! – sibidiba

1

尝试XStream。这很容易。希望能帮助到你!我现在没有时间完整的例子:)

+1

XStream看起来不错,但也喜欢1:1的映射。它支持XSLT,我想避免这种情况:原始文档*巨大*,并且发生更改。从长远来看,XPath更可靠,并且完全可以从我需要的DOM访问1%。 – sibidiba

1

一个选项可能是编写一个自定义注释,它将XPath表达式作为输入并执行绑定。