开发者

JAXB XJC - XPath evaluation results in empty target node?

开发者 https://www.devze.com 2023-04-01 11:48 出处:网络
I\'ve got the following simple XSD document (foo.xsd): <?xml version=\"1.0\" encoding=\"UTF-8\"?>

I've got the following simple XSD document (foo.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:foo">
  <xsd:element name="Person">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Name" type="xsd:string"/>
        <xsd:element name="Height">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="Short"/>
              <xsd:enumeration value="Average"/>
              <xsd:开发者_Go百科enumeration value="Tall"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

And I'd like to hint to the XJC JAXB compiler that the "Height" element should use a type safe enum class by using an external bindings file, like so (foo.xjb):

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xsd="http://www.w3c.org/2001/XMLSchema"
              jxb:version="2.0">
  <jxb:bindings schemaLocation="foo.xsd">
    <jxb:bindings node="//xsd:element[@name='Height']/xsd:simpleType">
      <jxb:typesafeEnumClass name="Height" />
    </jxb:bindings>
  </jxb:bindings>
</jxb:bindings>

But when I run the command "xjc -b foo.xjb foo.xsd" I get the following error:

parsing a schema...
[ERROR] XPath evaluation of "//xsd:element[@name='Height']/xsd:simpleType" results in empty target node
  line 6 of file:/Users/maerics/src/java/jaxb/foo.xjb

Failed to parse a schema.

The XPath expression looks fine to me so I'm guessing there is some subtle problem related to XML namespaces? I've tried a few combinations of using (or not) a default namespace, targetNamespace, etc. but always the same error. Note that xjc generates Java source for the XSD file by itself, without the external bindings file, as expected. Similarly, using embedded binding definitions in the XSD file works as expected.

Note that I am using Java version "1.6.0_26" and xjc version "JAXB 2.1.10 in JDK 6" on Mac OS 10.6.8.

Can someone explain how to achieve this goal without modifying the original XSD?


Heh, you're going to kick yourself when you see the problem:

In foo.xsd, you have this:

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

In foo.xjb, you have this:

xmlns:xsd="http://www.w3c.org/2001/XMLSchema"

Note "w3" vs. "w3c". Those two attributes need to match exactly, and then your XPath will work (otherwise the namespace referenced in your xjb is distinct from the XSD namespace referenced in your XSD.)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号