質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

xsd:includeによるschemaLocationの設定について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,473

keisukestrat

score 13

前提・実現したいこと

下記ディレクトリ構成のXSDファイル構成において
schemaLocationに手を加えずに参照先を変え、
Antからのxjc実行によるJavaのクラスファイルを生成したいと考えております。
※ファイル自体は外部からの提供ファイルのため、変更を加えない方向で検討したいと思っております。
※B.xsdのschemaLocationをディレクトリに合せた変更をすれば正常にクラスファイル生成ができることは確認しています。

[フォルダ階層]
/resource
 ├A.xsd
 └hoge
    └B.xsd

[A.xsd]
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">
    <xsd:simpleType name="A">
        ~中略~
    </xsd:simpleType>
    <xsd:attributeGroup name="AattbuteG">
        <xsd:attribute name="Afoo" type="xsd:int" />
    </xsd:attributeGroup>
</xsd:schema>

[B.xsd]
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">
    <xsd:include schemaLocation="A.xsd" />
    <xsd:element name="BTest">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="A">
                    <xsd:attributeGroup ref="AattbuteG" />
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

- イタリックテキスト
B.xsdのschemaLocationを変更することなく、
xjc実行時にA.xsdを../A.xsdに読み替える、
又は、
予めA.xsdをパスに保持しておき、B.xsdが読み込まれた際に、パスから取得するような動作
もしくは、
C.xsdを自作し、A.xsdとB.xsdの階層関係を保持して読み込ませる等
は可能でしょうか?

発生している問題・エラーメッセージ

特に何も指定せず、B.xsdのxjc実行を行うと下記のエラーが発生します。
WARNING] schema_reference.4: Failed to read schema document 'A.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
[exec]   line 2 of file:/ファイルパス/B.xsd

該当のソースコード

<exec executable="xjc" resultproperty="xjc.result">
  <arg line="-d resource"/>
  <arg line="-extension"/>
</exec>

試したこと

【1】
B.xsdのschemaLocationを"../A.xsd"と指定し、xjcを実行し、正常に作成ができることは確認済み。
※但し、外部ファイルのため、極力修正したくありません。
【2】
C.xsdを作成し、includeでA.xsdとB.xsdをフォルダパスを指定し、xjc実行、同様のエラーが発生しました。

補足情報(言語/FW/ツール等のバージョンなど)

>xjc -version
xjc version "JAXB 2.1.10 in JDK 6"
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build JAXB2.1.10 in JDK 6)

>java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

Eclipse Platform
Version: 3.5.2
Build id: M20100211-1343

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tmakita

    2016/10/07 14:26

    カタログファイルを用意し、xjcの-catalogパラメータを使用して、"A.xsd"を実際のファイル階層のA.xsdにマッピングすれば出来るように思えます.カタログファイルについてはお使いいただいたことはございますか?

    キャンセル

  • keisukestrat

    2016/10/07 14:33

    xjcの-catalogについて使用したことはありませんでした。カタログファイルについて調べてみます。参考例等あると幸いです。

    キャンセル

  • tmakita

    2016/10/07 14:39

    Googleで検索すれば出てきますが、例えば http://blog.bdoughan.com/2011/10/jaxb-xjc-imported-schemas-and-xml.html のようなものがあります.

    キャンセル

回答 1

checkベストアンサー

0

まだ怪しげなところはありますが、とりあえずビルドだけは通りました.

まず以下がフォルダ構成です.

イメージ説明

各ファイルは次のとおりです.

[resource/A.xsd]

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="person">
        <xsd:complexType>
            <xsd:attribute name="name" type="xsd:string"/>
            <xsd:attribute name="age" type="xsd:int"/>
            <xsd:attribute name="sex" type="sex"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="sex">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

[reource/hoge/B.xsd]

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="A.xsd"/>
    <xsd:element name="persons">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="person" 
                    minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

[カタログファイル(試行錯誤の上これでやっと通りました)]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE catalog PUBLIC "-//OASIS//DTD XML Catalogs V1.1//EN" "http://www.oasis-open.org/committees/entity/release/1.1/catalog.dtd">
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <!-- Replace the suffix of system IDs -->
    <systemSuffix systemIdSuffix="A.xsd" uri="resource/A.xsd"/>
    <systemSuffix systemIdSuffix="B.xsd" uri="resource/hoge/B.xsd"/>
</catalog>

[サンプルインスタンス test.xml]
カタログファイルを使用すれば、Xercesによる検証はOKで通ります.

<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="B.xsd">
    <person name="tmakita" age="20" sex="male"/>
    <person name="yuko" age="18" sex="female"/>
</persons>

[build.xml]

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." name="xjc.test" default="main">
    <target name="main">
        <exec executable="xjc.exe"  resultproperty="xjc.result">
            <arg line="-d ${basedir}${file.separator}out"/>
            <arg line="-extension"/>
            <arg line="-catalog ${basedir}${file.separator}catalog.xml"/>
            <arg line="-nv"/>
            <arg line="-verbose"/>
            <arg line="${basedir}${file.separator}resource${file.separator}hoge/B.xsd"/>            
        </exec>
    </target>
</project>

[実行ログ]

Executing:
"c:\program files\oxygen xml editor 18\jre/bin/java" -Xmx256m -classpath "C:\Program Files\Oxygen XML Editor 18\tools\ant/lib/ant-launcher.jar" "-Dant.home=C:\Program Files\Oxygen XML Editor 18\tools\ant" org.apache.tools.ant.launch.Launcher -lib "C:\Program Files\Oxygen XML Editor 18\lib\resolver.jar" -lib "C:\Program Files\Oxygen XML Editor 18\lib\xml-apis.jar" -f "build.xml" "-Dwebhelp.trial.license=no" -Dxml.catalog.verbosity=999

Buildfile: C:\Users\toshi\OneDrive\Documents\study\xml\20161007\build.xml

main:
     [exec] スキーマの解析中...
     [exec] スキーマのコンパイル中...
     [exec] [INFO] generating code
     [exec] 不明な場所
     [exec] 
     [exec] generated\ObjectFactory.java
     [exec] generated\Person.java
     [exec] generated\Persons.java
     [exec] generated\Sex.java

BUILD SUCCESSFUL
Total time: 3 seconds

The process finished with exit code: 0

oXygen 18.0でやっています.out/generatedフォルダを見たら、こんな感じで.javaファイルが出来ていました.

C:\Users\toshi\OneDrive\Documents\study\xml\20161007\out\generated>dir
 ドライブ C のボリューム ラベルは Windows8_OS です
 ボリューム シリアル番号は 1CA4-CBD8 です

 C:\Users\toshi\OneDrive\Documents\study\xml\20161007\out\generated のディレクト
リ

2016/10/08  01:43    <DIR>          .
2016/10/08  01:43    <DIR>          ..
2016/10/08  01:43             1,536 ObjectFactory.java
2016/10/08  01:43             2,880 Person.java
2016/10/08  01:43             2,143 Persons.java
2016/10/08  01:43             1,442 Sex.java
               4 個のファイル               8,001 バイト
               2 個のディレクトリ  363,812,323,328 バイトの空き領域

参考にしていただければ幸いです.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/12 09:19

    catalogファイルの配置で少し手間取ってしまい、回答が遅くなり申し訳ありません。
    此方でも確認できました。
    とても助かりました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る