Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过XPath将XML映射到Java对象?_Java_Xml_Jakarta Ee_Xpath - Fatal编程技术网

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

如何通过XPath将XML映射到Java对象?,java,xml,jakarta-ee,xpath,Java,Xml,Jakarta Ee,Xpath,给出XML示例: <fooRoot> <bar> <lol>LOLOLOLOL</lol> </bar> <noob> <boon> <thisIsIt></thisIsIt> </boon> </noob> </fooRoot> 限制条件: 不应转换XML,它是作为已解析的org.w3c.dom.

给出XML示例:

<fooRoot>
  <bar>
    <lol>LOLOLOLOL</lol>
  </bar>
  <noob>
    <boon>
      <thisIsIt></thisIsIt>
    </boon>
  </noob>
</fooRoot>
限制条件:

  • 不应转换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)


到离我最近的地方来。然而,该工具是对Java对象的完整层次结构进行marshall/unmarshall处理的工具。我只想在运行时将XML文档的一部分提取到现有的JavaBean中。

试试看。非常简单。希望有帮助!我现在没有时间讲完整的示例:)

一个选项是编写一个自定义注释,该注释将XPath表达式作为输入并进行绑定

注意:我是领导和专家组成员

可以使用MOXy执行此操作:

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

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

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

  @XmlTransient
  Object somethingUnrelated;
}
了解更多信息


XStream看起来不错,但也更喜欢1:1映射。它支持XSLT,这是我想要避免的:原始文档非常庞大,并且需要更改。从长远来看,XPath更可靠,非常适合从我需要的DOM访问这1%。
@XmlRootElement(name="fooRoot")
class MyFoo {

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

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

  @XmlTransient
  Object somethingUnrelated;
}