jxpath不遵守JAXB的xjc生成的类的XmlElement名称

时间:2015-03-15 05:33:10

标签: jaxb jxpath

我使用XML Schema Definition和JAXB生成具有正确@XmlElement@XmlRootElement注释的Java类。

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

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

我认为它与this question有关,但在我的情况下,我实际上并不认为在自动生成的类上使用了什么样的技巧和装饰,只要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 -p org.pd.jx example.xsd 

这是xjc生成的Record.java类(减去注释):

@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;}
}

然后,尝试通过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"

1 个答案:

答案 0 :(得分:1)

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