2016-12-06 4 views
1

Я пытаюсь определить файл .xsd, который будет ограничивать XML-документ, содержащий определенную информацию. Это .xsd.Как мне потребовать, чтобы XML-документ содержал один и единственный экземпляр элемента?

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
     targetNamespace="http://www.example.org/MicroscopyExperiment" 
     xmlns:tns="http://www.example.org/MicroscopyExperiment"> 
    <element name="MicroscopyExperiment"> 
    <complexType> 
     <sequence> 
     <element name="goal" type="string" minOccurs="1" maxOccurs="1"/> 
     <element name="cellType" type="string"/> 
     <element name="cellDensity" type="string"/> 
     <element name="injury" type="string"/> 
     <element name="drug" type="string"/> 
     <element name="media" type="string"/> 
     <element name="timing" type="string"/> 
     <element name="coating" type="string"/> 
     <element name="plateList"> 
      <complexType> 
      <sequence> 
       <element name="plate" 
         type="tns:plateType" 
         maxOccurs="unbounded" 
         minOccurs="1"/> 
      </sequence> 
      </complexType> 
     </element> 
     </sequence> 
    </complexType> 
    </element> 
    <complexType name="plateType"> 
    <sequence> 
     <element name="goalDiff" type="string"/> 
     <element name="cellTypeDiff" type="string"/> 
     <element name="cellDensityDiff" type="string"/> 
     <element name="injuryDiff" type="string"/> 
     <element name="drugDiff" type="string"/> 
     <element name="mediaDiff" type="string"/> 
     <element name="timingDiff" type="string"/> 
     <element name="coatingDiff" type="string"/> 
    </sequence> 
    </complexType> 
</schema> 

Этот .xsd-файл проверяет штраф в выпуске Eclipse Neon.1a (4.6.1).

Затем я создал первый XML-файл для проверки этой схемы. Это файл .xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE xml> 
<MicroscopyExperiment 
    xmlns:tns="http://www.example.org/MicroscopyExperiment" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/MicroscopyExperiment MicroscopyExperiment.xsd"> 

</MicroscopyExperiment> 

Это также хорошо подходит для Eclipse. Я не получаю никаких сообщений об ошибках о том, что вы не можете найти файл .xsd, который весь день сводил меня с ума. Проблема в том, что .xml не должен проверяться. Я установил как minOccurs, так и maxOccurs для элемента цели 1, чтобы потребовать, чтобы он выполнялся один раз и только один раз. Однако в файле .xml нет цели, поэтому она не должна проверяться.

Любые советы были бы высоко оценены.

С уважением,

Dessie

+0

Можете ли вы добавить образец XML-файла? –

ответ

1

Вы делаете немного беспорядок с пространствами имен. В схеме вы включаете targetNamespace. Это означает, что все объявленные глобально элементы принадлежат к этому пространству имен.

В вашем XML-файле, однако, вы используете MicroscopyExperiment без префикса пространства имен. И поскольку вы также не объявляете пространство имен по умолчанию, этот элемент не сопоставляется с объявлением элемента в схеме. Одним из способов решения этой проблемы является объявить правильное пространство имен по умолчанию в файле XML:

<MicroscopyExperiment 
    xmlns="http://www.example.org/MicroscopyExperiment" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/MicroscopyExperiment MicroscopyExperiment.xsd"> 
</MicroscopyExperiment> 

Другим решением является добавление префикса пространства имен для имени элемента:

<tns:MicroscopyExperiment 
    xmlns:tns="http://www.example.org/MicroscopyExperiment" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/MicroscopyExperiment MicroscopyExperiment.xsd"> 
</tns:MicroscopyExperiment> 

ДОПОЛНЕНИЯ: Примечания что и maxOccurs="1" по умолчанию, вам не нужно включать их в схему. Кроме того, вы, вероятно, должны добавить атрибут elementFormDefault="qualified" в элемент schema, , иначе локальные элементы (plate) не принадлежат ни одному пространству имен, что вызовет больше путаницы.

+1

Пробовал решение добавить tns: prefix к MicroscopyExperiment и решил мою краткосрочную проблему. Будет также включать некоторые из ваших других предложений. – Dessie