jxpath不尊重JAXB';xjc生成的类的XmlElement名称

jxpath不尊重JAXB';xjc生成的类的XmlElement名称,jaxb,jxpath,Jaxb,Jxpath,我使用XML模式定义和JAXB生成带有适当注释的Java类 由于模式中有一些深层嵌套(不是我的选择),我宁愿使用jxpath来访问使用XPath的深层类(而不是使用.getThat()和that!=null的繁琐菊花链) 问题是一些XML元素名称包含破折号,例如foobar。当我尝试使用org.apache.jxpath访问元素时,我需要重写我的XPath,以便将这些名称改为驼峰大小写(fooBar),就像实际Java对象的名称一样。有没有办法告诉jxpath使用对应于XML元素名称的XPath

我使用XML模式定义和JAXB生成带有适当注释的Java类

由于模式中有一些深层嵌套(不是我的选择),我宁愿使用
jxpath
来访问使用XPath的深层类(而不是使用
.getThat()
that!=null
的繁琐菊花链)

问题是一些XML元素名称包含破折号,例如
foobar
。当我尝试使用
org.apache.jxpath
访问元素时,我需要重写我的XPath,以便将这些名称改为驼峰大小写(
fooBar
),就像实际Java对象的名称一样。有没有办法告诉
jxpath
使用对应于XML元素名称的XPath(而不是驼峰大小写的Bean名称)查找元素

我认为这与,但是在我的例子中,我不知道在自动生成的类上使用了什么样的技巧和装饰,只要xjc可以做到

下面是一个简单的例子来说明这个问题

首先,一个小的XSD文件:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="record">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="foo-bar" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
下面是xjc生成的
Record.java
类(减去注释):

然后,尝试通过
jxpath
访问数据(实际上,我必须处理大量深度嵌套的类),您可以在下面看到正确的XPath(
“foo bar”
)不起作用,但是驼峰格式的版本起作用

    Record record = new Record();
    record.setFooBar("hello world");

    JXPathContext context = JXPathContext.newContext(record);
    context.setLenient(true);
    String a = (String)context.getValue("foo-bar", String.class);  // is null
    String b = (String)context.getValue("fooBar", String.class);  // "hello world"

我相信JXPath操作对象属性,而不是它们对应的XML元素。我认为JXPath不会解析任何JAXB元数据,因此它不会知道您映射的XML节点。您看到的似乎是预期的行为。

谢谢@BlaiseDoughan。这就是我所担心的。。。好吧。因为对于这些类,我非常方便,所以我编写了一个XPath的快速重写,将其转换为基于类名(即camel case)的形式。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {"fooBar"})
@XmlRootElement(name = "record")
public class Record {
    @XmlElement(name = "foo-bar", required = true)
    protected String fooBar;
    public String getFooBar() {return fooBar;}
    public void setFooBar(String value) {this.fooBar = value;}
}
    Record record = new Record();
    record.setFooBar("hello world");

    JXPathContext context = JXPathContext.newContext(record);
    context.setLenient(true);
    String a = (String)context.getValue("foo-bar", String.class);  // is null
    String b = (String)context.getValue("fooBar", String.class);  // "hello world"