13

我有以下简单的 XSD 文档 ( 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:enumeration value="Tall"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

而且我想向 XJC JAXB 编译器提示,“Height”元素应该通过使用外部绑定文件来使用类型安全的枚举类,如下所示(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>

但是当我运行命令“ xjc -b foo.xjb foo.xsd”时,出现以下错误:

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.

XPath 表达式对我来说看起来不错,所以我猜有一些与 XML 命名空间相关的微妙问题?我尝试了一些使用(或不使用)默认命名空间、targetNamespace 等的组合,但总是出现相同的错误。请注意xjc,如预期的那样,它会自行为 XSD 文件生成 Java 源,而无需外部绑定文件。同样,在 XSD 文件中使用嵌入式绑定定义可以按预期工作。

请注意,我在 Mac OS 10.6.8 上使用 Java 版本“1.6.0_26”和 xjc 版本“JDK 6 中的 JAXB 2.1.10”。

有人可以解释如何在不修改原始 XSD 的情况下实现这一目标吗?

4

1 回答 1

39

嘿嘿,看到问题你就自取其辱吧:

在 foo.xsd 中,你有这个:

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

在 foo.xjb 中,你有这个:

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

注意“w3”与“w3c”。这两个属性需要完全匹配,然后您的 XPath 才能工作(否则 xjb 中引用的命名空间与 XSD 中引用的 XSD 命名空间不同。)

于 2011-09-03T21:45:42.207 回答