2011-08-31 38 views
11

我有以下簡單的XSD文件(foo.xsd):JAXB XJC - XPath評估結果爲空目標節點?

<?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編譯器的「高度」元素應該使用一個使用類型安全的枚舉類外部綁定文件,像這樣(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的情況下實現此目標嗎?

回答

26

嘿,你會踢自己,當你看到問題:

在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名稱空間不同)。

+0

Ha!謝謝你多一雙眼睛;這就是我手工編寫XML所得到的結果,我想= = – maerics

+0

賞金系統讓我儘快來... – maerics

+0

有同樣的問題,但我的問題是,甚至沒有將xsd聲明爲命名空間。 DOH。 –