0

要件は、xsdで定義された一部の要素のみをルート要素としてアクセスできるようにすることです。したがって、そのためのアプローチは、複合型を宣言してそれらを参照することにより、他のすべての要素をローカルにすることです。

ただし、アクセスできない要素またはローカル要素が別のxsd定義で必要な場合、つまり*、それらは別のxsdで定義された他の名前空間に属する要素の子要素である可能性があります。

この種のスキーマ定義を実現するにはどうすればよいですか?

たとえば、次のように、A:rootとcustom:rootだけをinner:Aではなく有効なルートにしたいので、root要素の下でinnerAを宣言し、型を参照しましたが、A:innerAは要素の下に入ることができますか?

B.xsdでinnerAを定義することはできません。bczを使用すると、innerAがB.xsdのターゲット名前空間(カスタム名前空間)に配置されます

例えば

A.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    targetNamespace="http://www.abc.com/custom"
    xmlns:A="http://www.abc.com/A" 
    xmlns:custom="http://www.abc.com/custom">
<xsd:import namespace="http://www.abc.com/custom"
        schemaLocation="B.xsd"/>

<xsd:complexType name="innerType">
   <xsd:sequence>
      <xsd:element name="abc" type="xs:string"/>
   </xsd:sequence>
</xsd:complexType>

<xsd:element name="root">
        <xsd:complexType mixed="true">
            <xsd:choice>
                <xsd:element ref="custom:root">
                 <xsd:element name="innerA" type="A:innerType"/>
            </xsd:choice>
        </xsd:complexType>
</xsd:element>

B.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    targetNamespace="http://www.abc.com/custom"
    xmlns:A="http://www.abc.com/A" 
    xmlns:custom="http://www.abc.com/custom">
<xsd:import namespace="http://www.abc.com/A"
        schemaLocation="A.xsd"/>
    <xsd:element name="root">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:element ref="A:innerA"/>
            </xsd:sequence>
        </xsd:complexType>
   </xsd:element>

上記のB.xsdの最後から4番目の行でエラーが発生します。どうすればinnerA要素を参照できますか。何か提案はありますか?

XML

 <A:root xmlns:A="http://www.abc.com/a" xmlns:custom="http://www.abc.com/custom"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation=""http://www.abc.com/a "http://www.abc.com/a/A.xsd">
    <custom:root>
       <A:innerA>
          <A:abc>
       </A:innerA>
    </custom:root>
    </A:hello>
4

1 に答える 1

0

簡単な答えですが、ローカルで宣言された要素を参照することはできません(JavaまたはC#ではプライベートと考えてください)。グローバルの場合は、ドキュメントのルート要素になる可能性があります。グローバルがルート要素になるのを防ぐ唯一の方法は、検証プログラムに拡張機能を実装して、ルートにある要素をチェックすることです。アプローチを一般的にしたい場合は、appinfoを使用できます。

.NETを使用していると仮定しましょう。XMLを使用する前に、ドキュメント要素の修飾名をチェックして、許可されたリストに含まれているかどうかを確認できます。このリストを別の構成ファイルで構成することも、XSD自体を使用することもできます。XMLを検証するには、とにかくXmlSchemaSetでXSDをコンパイルする必要があります。したがって、appinfoでマークアップを使用する場合は、すべてのグローバル要素にアクセスしてそのマークアップを確認し、見つかったら、その要素の修飾名を上記のリストに追加します。

Javaの場合、同様のことができます。

スキーマオブジェクトモデルをサポートしていない言語を扱っている場合は、XSDをXMLファイルとして処理できます。これに伴う問題は、インクルード/インポートをトラバースする必要があるため、複雑になることです。基本的には、外部参照を自分で解決することになります。

覚えておかなければならないことの1つは、自分のものではないXSDを使用することになったとしても、それらのXSDがグローバル要素を使用している場合、appinfoでできることは何もないということです。事前設定されたリストに固執します。

これはあなたの問題に対する私自身の考えなので、リンクはありません。代わりに、appinfoのドキュメントを探していた場合は、これを試してください。

于 2012-06-15T00:27:08.803 に答える