6

次のような別のxsdファイルをインポートするxsdファイル(yahoo.xsd)があります。

  <xs:import schemaLocation="stock.xsd"/>
  <xs:attribute name="lang" type="xs:NCName"/>

stock.xsdは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng">
<xs:import namespace="http://www.yahooapis.com/v1/base.rng" schemaLocation="yahoo.xsd"/>
<xs:element name="quote">
<xs:complexType>
  <xs:sequence>  
    <xs:element ref="Symbol"/>
  </xs:sequence>
  <xs:attribute name="symbol" use="required" type="xs:NCName"/>
</xs:complexType>
</xs:element>
<xs:element name="Symbol" type="xs:NCName"/>
</xs:schema>

xjcでコンパイルすると、次のエラーメッセージが表示されます。

[エラー]プロパティ「シンボル」はすでに定義されています。<jaxb:property>を使用して、この競合を解決します。

私は基本的にこれの解決策をSOで見つけました(JAXBコンパイルの問題-[エラー]プロパティ "Any"はすでに定義されています)が、動作させることができません。XPathが間違っていると思います。

これは私が使用しているバインディングファイルです:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
      xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      version="2.1">
<bindings schemaLocation="yahoo.xsd" version="1.0" >
    <!-- rename the value element -->
        <bindings node="//xs:element[@name='quote']/xs:complexType/xs:sequence/xs:element[@ref='Symbol']">
            <property name="SymbolAttribute"/>
    </bindings>
</bindings>

xjc -bを使用してコンパイルしている場合、XPath評価の結果は空のターゲットノードになると表示されます。

おそらく、シンボル定義の名前を変更してから、参照の名前も変更する必要がありますか?これを自動的に行う方法は?

4

1 に答える 1

6

この行について質問させてください。

<xs:element ref="Symbol"/>

Symbol は yahoo.xsd で定義されているか、同じ xsd ファイルでローカルに定義されていますか?

いくつかの事実を推測してみます。

2 つの XSD があると仮定します: yahoo.xsdand some.xsd(投稿の最初の 1 つ)。「Symbol」型は ではsome.xsdなく で定義されているという強い確信がありyahoo.xsdます。それ以外の場合は、名前空間のプレフィックス ("yahoo:Symbol" ?) が必要です。

さて、あなたの some.xsd が次のように見えるのは本当ですか:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" >
    <!-- It's not important right now: -->
    <!--<xs:import namespace="http://www.yahooapis.com/v1/base.rng" schemaLocation="yahoo.xsd"/>-->

    <!-- declaration you omitted in your post, it's only example -->
    <xs:element name="Symbol">
        <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="0"/>
              <xs:maxInclusive value="100"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

    <xs:element name="quote">
        <xs:complexType>
          <xs:sequence>  
            <xs:element ref="Symbol"/>
          </xs:sequence>
          <xs:attribute name="symbol" use="required" type="xs:NCName"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

私の言うことが本当なら、jaxb バインディングは次のようになります。

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
      xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      version="2.1">
    <bindings schemaLocation="some.xsd"> <!-- not yahoo.xsd -->
        <bindings node="//xs:element[@name='quote']/xs:complexType/xs:sequence/xs:element[@ref='Symbol']">
            <property name="SymbolAttribute" />
        </bindings>
    </bindings>

</bindings>

生成された Java クラスは次のようになります。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "symbolAttribute"
})
@XmlRootElement(name = "quote")
public class Quote {

    @XmlElement(name = "Symbol")
    protected int symbolAttribute;
    @XmlAttribute(name = "symbol", required = true)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlSchemaType(name = "NCName")
    protected String symbol;
    ....
于 2013-03-04T09:32:41.213 に答える