2011-08-31 7 views
11

mam następujący prosty dokument XSD (foo.xsd):JAXB XJC - ocena XPath skutkuje pustym węzłem docelowym?

<?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> 

I chciałbym schować do kompilatora XJC JAXB, że „wysokość” element powinien użyć typu bezpiecznej klasy enum przez stosując wiązania plików zewnętrznych, tak jak (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> 

Ale kiedy uruchomić komendę "xjc -b foo.xjb foo.xsd" pojawia się następujący błąd:

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. 

Wyrażenie XPath wygląda dobrze dla mnie, więc zgaduję, że istnieje pewien subtelny problem związany z obszarami nazw XML? Próbowałem kilka kombinacji użycia (lub nie) domyślnego obszaru nazw, targetNamespace, itp., Ale zawsze ten sam błąd. Zauważ, że xjc generuje samo źródło Java dla pliku XSD, bez zewnętrznego pliku powiązań, zgodnie z oczekiwaniami. Podobnie, używanie osadzonych definicji powiązań w pliku XSD działa zgodnie z oczekiwaniami.

Należy pamiętać, że używam wersji Java "1.6.0_26" i wersji xjc "JAXB 2.1.10 w JDK 6" na Mac OS 10.6.8.

Czy ktoś może wyjaśnić, jak osiągnąć ten cel, bez modyfikowania oryginalnego XSD?

Odpowiedz

26

Heh, masz zamiar kopać siebie, kiedy pojawi się problem:

W foo.xsd, masz to:

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

W foo.xjb, masz to:

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

Uwaga "w3" a "w3c". Te dwa atrybuty muszą dokładnie pasować, a następnie XPath będzie działać (w przeciwnym razie przestrzeń nazw wymieniona w twoim xjb różni się od przestrzeni nazw XSD wymienionej w twoim XSD.)

+0

Ha! Dzięki za dodatkową parę oczu; to jest to, co otrzymuję za pisanie XML ręcznie, jak sądzę =) – maerics

+0

Bounty przychodzi, gdy tylko system pozwala mi ... – maerics

+0

Miałem ten sam problem, jednak moim problemem było to, że xsd nie został nawet zadeklarowany jako przestrzeń nazw. DOH. –