Вопрос по schema, validation, xml, xsd, xmllint – Ошибка проверки XSD: Элемент "{http://www.example.com} Scope": Этот элемент не ожидается. Ожидаемый (Сфера)

8

Я создал следующий XSD (с Eclipse):

<code>  <?xml version="1.0" encoding="UTF-8"?>
  <schema targetNamespace="http://www.example.com" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.example.com">
    <element name="Make">
      <complexType>
        <sequence>
          <element name="Scope"></element>
        </sequence>
      </complexType>
    </element>
  </schema>
</code>

и проверка с помощью этого простого XML

<code>  <?xml version="1.0"?>
  <Make xmlns="http://www.example.com">
    <Scope>
    </Scope>
  </Make>
</code>

дает:

<code>  xmllint.exe --noout --schema sources.xsd sources.xml
  sources.xml:3: element Scope: Schemas validity error : Element '{http://www.example.com}Scope': This element is not expected. Expected is ( Scope ).
  sources.xml fails to validate
</code>

На мой взгляд, этоmust быть правильным: файл XML находится в пространстве именhttp://www.example.com (что также говорит валидатор).

А для XSD я устанавливаю пространство имен по умолчанию для схемы XSD (это то, что делает Eclipse, поэтому оно должно быть правильным!), И я даю правильный targetNamespace. Я также пытался использовать

<code><element name="tnd:Scope" />
</code>

Однако это тоже не работает.

Это ошибка в xmllint или где проблема?

С уважением DIVB

Опечатка?tnd:Scopeдолжно бытьtns:Scope Filburt

Ваш Ответ

3   ответа
1

если вы не хотите или не хотите менять XSD. Следующий XML соответствует вашему XSD:

<?xml version="1.0"?>
<tns:Make xmlns:tns="http://www.example.com">
    <Scope>
    </Scope>
</tns:Make>

ЕслиelementFormDefault установлен как неквалифицированный, вы должны определить пространство имен для глобальных элементов, и вы не должны определять пространство имен для локальных элементов. Глобальные элементы - это элементы, расположенные непосредственно под элементом схемы в XSD, а локальные элементы - это элементы, вложенные в другие элементы. Ваша ошибка вызвана определением пространства имен для локального элемента Scope с использованием пространства имен по умолчанию.

Есть дополнительные объяснения наhttp://www.oracle.com/technetwork/articles/srivastava-namespaces-092580.html.

2

You have to set both the targetNamespace and the root XSD namespace to the same value, if you don't want to specify any qualifier in the XML file to be validated. So it would have to be:

<schema targetNamespace="http://www..com" xmlns="http://www..com" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Но тогда, конечно, вы должны квалифицировать элементы XSD с помощью xsd :. Другими словами, чтобы ваш XML-файл был проверен как есть, вам нужно написать следующую схему:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://www..com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www..com">
    <xsd:element name="Make">
        <xsd:complexType>
            <xsd:sequence>
               <xsd:element name="Scope"></xsd:element>
            </xsd:sequence>
       </xsd:complexType>
    </xsd:element>
</xsd:schema>

Смотрите здесь для получения дополнительной информации:http://www.xfront.com/DefaultNamespace.pdf

EDIT Спасибо PetruGardea за указание на ошибку. Как следует из ответа Филберта,elementFormDefault являетсяunqualified по умолчанию это означает, что предполагается, что экземпляры документов находятся в целевом пространстве имен. Так что ответ Филберта верен - единственная альтернатива - сделать все это анонимным, опускаяtargetNamespace и оставивelementFormDefault какunqualifiedи затем полностью удаляет ссылку на пространство имен из документа экземпляра.

Вот хорошая разбивка того, чтоelementFormDefault делает:http://www.xfront.com/HideVersusExpose.html

К сожалению, ваш ответ не имеет ничего общего с вопросом; с XSD проблем нет, и то, что вы предлагаете, никак не меняет схему; ваш обновленный XSD не меняет результат проверки предложенного XML.
4

@dbasemans ответом будет указатьelementFormDefault какqualified:

 <schema targetNamespace="http://www.example.com"
     xmlns="http://www.w3.org/2001/XMLSchema"
     xmlns:tns="http://www.example.com"
     elementFormDefault="qualified">

С использованиемxsd или жеxs Префикс для вашего пространства имен схемы может рассматриваться как общий, поэтому вы можете захотеть изменить свою схему в соответствии с предложениемdbaseman.

& Quot; XSD: & Quot; является Microsoft и & quot; xs: & quot; это тот, который используется в спецификации XML-схемы ergo & quot; xsd: & quot; это определенно не стандарт (хотя некоторые люди предполагают, что Microsoft = Standard).
@divB Тебе все еще нужноtargetNamespace если вы не хотите скрыть (локализовать)example.com пространство имен в экземпляре документа.
Привет, спасибо (вам обоим)! Единственное, чего я тогда не понимаю: для чего тогда нужен targetNamespace? divB
На самом деле, ваш ответ правильный (+1) в отличие от другого, что неверно. Тем не менее, многие люди утверждают, чтоxsd можно считать стандартным префиксом - я бы использовал & quot; общий & quot; вместо. По факту,xs это тот, который определен вDTD это обычно сопровождает XSD для XSD ...

Похожие вопросы