Пространство имен элемента 'Root' должно быть из пространства имен схемы 'http://www.w3.org/2001/XMLSchema'? - PullRequest
1 голос
/ 07 февраля 2011

У меня есть XML-документ:

<?xml version="1.0" encoding="utf-8"?>
<Root>
  <Child name="MyType" compareMode="EQ"></Child>
</Root>

И я хотел бы проверить этот XML-файл с помощью следующего xsd:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Child">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" use="required" />
            <xs:attribute name="compareMode" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Когда я пытаюсь подтвердить его, я получаюследующая ошибка:

Exception in thread "main" org.xml.sax.SAXException: Validation failed against correct.xml. ErrorMessage:s4s-elt-schema-ns: The namespace of element 'Root' must be from the schema namespace, 'http://www.w3.org/2001/XMLSchema'.

Мой вопрос, почему Root должен находиться в пространстве имен схемы?Может ли быть так, что я проверяю документ xml не правильно?

публичный синхронизированный логический isValid (String xmlFragment, File xmlSchema) создает SAXException, IOException {

// 1. Поиск фабрикидля языка XML-схемы W3C

SchemaFactory factory = 
    SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

// 2. Compile the schema. 

Schema schema = factory.newSchema(xmlSchema);

// 3. Get a validator from the schema.
Validator validator = schema.newValidator();

// 4. Parse the document you want to check.
Source source = new StreamSource(new ByteArrayInputStream(xmlFragment.getBytes()));

// 5. Check the document    
    validator.validate(source);        
    return true;
}

Ответы [ 2 ]

4 голосов
/ 07 февраля 2011

Может ли быть, что xmlSchema содержит не схему, которую вы нам показали, а "схему для документов схемы", опубликованную W3C?Фрагмент сообщения об ошибке «ErrorMessage: s4s-elt-schema-ns:», кажется, намекает на это.

0 голосов
/ 07 февраля 2011

Документ действителен для определенной схемы, поэтому он должен быть чем-то с кодом.

Единственная явная ссылка на требуемое пространство имен (как указано в сообщении об ошибке) содержится в вызове SchemaFactory.newInstance,Что произойдет, если вы передадите туда пустое ("") пространство имен?

Кроме того, целесообразно явно указать ожидаемое пространство имен в документе XML в схеме.Есть несколько способов сделать это.Поскольку вы выбрали префикс пространства имен XMLSchema, я бы рекомендовал добавить xmlns="" targetNamespace="" к вашему тегу <xs:schema.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...