4

単純な XSD とさらに単純な XML があります。しかし、Java 2 XML 検証は失敗します。(javax.xml.validation を使用)

これが私のXSDです:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     xmlns:tns="http://foo.com/darnit"
     targetNamespace="http://foo.com/darnit">

   <xsd:element name="Person" type="tns:PersonType"/>

   <xsd:simpleType name="nameType">
     <xsd:restriction base="xsd:string"/>
   </xsd:simpleType>

   <xsd:complexType name="PersonType">
     <xsd:sequence>
       <xsd:element minOccurs="1" maxOccurs="2" name="FirstName" type="tns:nameType"/>
       <xsd:element minOccurs="1" maxOccurs="1" name="LastName" type="tns:nameType"/>
     </xsd:sequence>
   </xsd:complexType>
</xsd:schema>

サンプル XML は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Person xmlns="http://foo.com/darnit">
  <FirstName>John</FirstName>
  <FirstName>Michael</FirstName>
  <LastName>Smith</LastName>
</Person>

これが私が得るエラーメッセージです:

org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'FirstName'. One of '{FirstName}' is expected.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.reportSchemaError(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.jaxp.validation.StreamValidatorHelper.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.XMLSchemaValidator.validate(Unknown Source)
at javax.xml.validation.Validator.validate(Unknown Source)

XML を名前空間プレフィックスで修飾すると、機能します。

<?xml version="1.0" encoding="UTF-8"?>
<foo:Person xmlns:foo="http://foo.com/darnit">
  <FirstName>John</FirstName>
  <FirstName>Michael</FirstName>
  <LastName>Smith</LastName>
</foo:Person>

しかし、私の XSD では修飾されていない要素が許可されています。

SchemaFactory、Schema、または Validator でプロパティを設定する必要がありますか?

ありがとう。

4

1 に答える 1

2

次のように、 elementFormDefault=qualified をスキーマに追加します。

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:tns="http://foo.com/darnit"
 targetNamespace="http://foo.com/darnit"
 elementFormDefault="qualified">

次に、すべての要素がデフォルトでターゲット名前空間に配置されます。

グローバルに宣言されたすべての要素は、ターゲットの名前空間に属します。ただし、「elementFormDefault」属性は、ローカル要素もターゲット名前空間に属するかどうか、つまり「修飾されている」かどうかを制御します。誤って作成した「修飾されていない」スタイルを明らかに好む人もいます。しかし、私はそれを支持する良い議論を見たことがありません.

于 2013-06-24T13:04:01.543 に答える