如何通过XPath将XML映射到Java对象?

sib*_*iba 3 java xml xpath java-ee

给出XML示例:

<fooRoot>
  <bar>
    <lol>LOLOLOLOL</lol>
  </bar>
  <noob>
    <boon>
      <thisIsIt></thisIsIt>
    </boon>
  </noob>
</fooRoot>
Run Code Online (Sandbox Code Playgroud)

哪个应该映射到:

class MyFoo {
  String lol;
  String thisIsIt;
  Object somethingUnrelated;
}
Run Code Online (Sandbox Code Playgroud)

约束:

  • 不应该转换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;
}
Run Code Online (Sandbox Code Playgroud)

有什么同样存在吗?我发现要么需要严格的1:1映射(例如JMX,JAXB)或所有字段的手动迭代(例如SAX,Commons Digester).

JiBX绑定定义最接近我正在进行的操作.但是,此工具可用于编组/解组Java对象的完整层次结构.我只想在运行时将XML文档的一部分提取到现有的Java bean中.

bdo*_*han 5

注意: 我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2(JSR-222)专家组的成员.

你可以用MOXy做到这一点:

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

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

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

  @XmlTransient
  Object somethingUnrelated;
}
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息