XML スキーマを使用して、アプリケーションに XML ファイルをロードする際に XML ファイルを検証する方法を理解しようとしています。その部分は機能していますが、スキーマにルート要素以外を有効なものとして認識させることができないようです。たとえば、次の XML ファイルがあります。
<fun xmlns="http://ttdi.us/I/am/having/fun"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ttdi.us/I/am/having/fun
test.xsd">
<activity>rowing</activity>
<activity>eating</activity>
<activity>coding</activity>
</fun>
次の XSD を使用します (ビジュアル エディターから生成されたことは確かです。私はただの人間にすぎません)。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun">
<xsd:element name="fun" type="activityList"></xsd:element>
<xsd:complexType name="activityList">
<xsd:sequence>
<xsd:element name="activity" type="xsd:string" maxOccurs="unbounded" minOccurs="0"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
しかし今、Eclipse の組み込み (Xerces ベース?) バリデーターを使用すると、次のエラーが発生します。
cvc-complex-type.2.4.a: Invalid content was found starting with element 'activity'. One of '{activity}' is expected.
では、XSD が機能するように修正するにはどうすればよいでしょうか? これまでに見たすべての検索結果は、「…だから、検証をオフにした」または「…だから、名前空間を削除した」と言っているようですが、それは私がやりたいことではありません。
補遺:
ここで、スキーマを次のように変更するとします。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun">
<xsd:element name="activity" type="xsd:string"></xsd:element>
<xsd:element name="fun">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="activity" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
今は機能していますが、その方法<actvity>
は、ドキュメントのルートに置くことが許可されていることを意味しますか? そして、ref
をそのまま置換する必要がある場合、なぜ に置換できないref="actvity"
のname="activity" type="xsd:string"
でしょうか?
追加の補遺: 常にこれを実行してください。そうしないと、壁に頭をぶつけて何時間も費やすことになります。
DocumentBuilderFactory dbf;
// initialize dbf
dbf.setNamespaceAware(true);