8

いくつかの大きな DTD ファイルがあります。Trangを使用してそれらを XSD ファイルに変換したので、JAXB やその他のユーティリティから簡単に使用できました。ただし、生成された XSD ファイルには、すべての要素が最上位で宣言されています。これは、任意の要素が入力 XML のルート要素になる可能性があることを意味します。特定の要素だけを指定したい。

これらの複数のルート要素があると、すべてのクラスに対してxjc生成されるなど、いくつかの問題が発生する@XmlRootElementため、さらにチェックを追加する必要があります。

私が理解しているように、生成された XSD を書き直し、s を s に移動したり、 s<xs:element><xs:complexType>s に変更したりする必要があります。element refelement type

これを行うより効率的な方法はありますか?

4

2 に答える 2

0

あなたが説明していることから、いくつかのコメントで指摘されているように変換の「忠実度」を無視して、私はあなたが単純に(私が呼ぶもの)XMLスキーマの自動方法を探しているという事実を扱っていますリファクタリング。私は、この種の作業を目的とした製品であるQTAssistantに関連付けられているため、これが私が行う方法です...

何があっても手動で行う必要があるのは、ルートとして表示する (または表示しない) 要素のリストを把握してキャプチャすることです...これで完了です: ボタンを押すか、コマンドを呼び出します行を確認すると、有効な XSD が生成されているかどうかが確実にわかります。

リファクタリング エンジンは、必要に応じてグローバル型を作成し、不要なグローバル要素定義を削除し、refed 要素をインライン宣言に置き換えます。

(置換グループを知っているこれを読んでいる人にとっては、このリファクタリングは置換グループの先頭への参照を置き換えるものではありません。ここでは DTD からの XSD について話しているので、これは問題ではありません)。

この単純さと、反復可能で信頼できるという事実は、専用のリファクタリング ツールを使用する主な利点です。もう1つの利点:必要に応じて、xml名前空間を再割り当てすることもできます...

詳細に興味がある場合はお知らせください。小さなサンプルといくつかのイラストでこの投稿を更新します。

于 2012-05-25T18:23:32.153 に答える
0

単純な XSLT 変換を使用して、生成された XSD を処理しました。私の場合はうまくいきます:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
        >
    <xsl:template match="@*|node()|comment()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()|comment()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="xs:element/@ref"/>
    <xsl:template match="xs:element[@ref]">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="type"><xsl:value-of select="@ref"/></xsl:attribute>
            <xsl:attribute name="name"><xsl:value-of select="@ref"/></xsl:attribute>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="xs:element[@name = //xs:element/@ref and xs:complexType]">
        <xs:complexType name="{@name}">
            <xsl:apply-templates select="xs:complexType/node()"/>
        </xs:complexType>
    </xsl:template>
    <xsl:template match="xs:element[@name = //xs:element/@ref and @type]">
        <xsl:choose>
            <xsl:when test="//xs:complexType[@name = current()/@type]">
                <xs:complexType name="{@name}">
                    <xs:complexContent>
                        <xs:extension base="{@type}"/>
                    </xs:complexContent>
                </xs:complexType>
            </xsl:when>
            <xsl:otherwise>
                <xs:simpleType name="{@name}">
                    <xs:restriction base="{@type}"/>
                </xs:simpleType>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

参照されている要素定義を検出し、それらをcomptexTypes にして、ref を変更します。参照されていないすべての要素が開始要素になります。

于 2012-05-28T09:20:10.513 に答える