проблема преобразования xml в xsd - PullRequest
0 голосов
/ 20 августа 2009

У меня есть XML, который я хочу проверить в Java.

Единственная проблема, которую я оставил, - это попытка написать XSD для атрибута, который на самом деле является ссылкой на пространство имен. Невозможно использовать "", потому что xmlns не разрешен в качестве имени атрибута. Есть идеи?

XML

<header>        
<abc xmlns="www.example.org">
<user>me</user>               
</abc>
</header>

XSD :

<xs:element name="header">
<xs:complexType> 
<xs:sequence>  
 <xs:element name="abc">  
 <xs:complexType>   <xs:sequence>
     <xs:element name="user" type="xs:string" />      
 </xs:sequence>  
 </xs:complexType>  
 </xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>

Ответы [ 2 ]

1 голос
/ 29 августа 2009

Элемент header не имеет объявленного пространства имен, поэтому он получает "безымянное пространство имен". Атрибут xmlns в элементе abc объявляет пространство имен как www.example.org (без префикса пространства имен). Элемент "user" фактически находится в пространстве имен www.example.org , поскольку он является дочерним элементом элемента " abc ", который имеет объявленное пространство имен ( xmlns = "www.example.org ).

Ни один из наборов элементов не использует префиксы пространства имен для устранения неоднозначности двух «типов» элементов, поэтому, когда вы на них смотрите, это немного сбивает с толку. Возможно, было бы более понятно, если бы вы использовали префикс пространства имен для www.example.org пространства в вашем XML, например:

<?xml version="1.0" encoding="UTF-8"?>
<header xmlns:example="www.example.org">        
    <example:abc >
        <example:user>me</example:user>               
    </example:abc>
</header> 

Приведенный выше XML и опубликованный вами XML эквивалентны, но немного легче понять, какие элементы «принадлежат» к пространству имен « www.example.org » когда вы используете префикс пространства имен.

Утилита генерации схем oXygen создала две схемы (ниже), которые импортируют друг друга.

Ваш образец XML-документа проверяется по этим схемам (поскольку они оба импортируют друг друга, вы можете ссылаться на любую из них, когда вызываете проверку)

Первый файл схемы sampleSchema.xsd :

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:ns1="www.example.org">
  <xs:import namespace="www.example.org" schemaLocation="example.xsd"/>
  <xs:element name="header">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="ns1:abc"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Второй файл схемы example.xsd :

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="www.example.org" xmlns:ns1="www.example.org">
  <xs:import schemaLocation="sampleSchema.xsd"/>
  <xs:element name="abc">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="ns1:user"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="user" type="xs:NCName"/>
</xs:schema>
0 голосов
/ 20 августа 2009

'xmlns' зарезервировано как Пространства имен в XML 1.0 .

Редактировать: Если вы хотите, чтобы определенные элементы принадлежали пространству имен, вы также должны использовать это пространство имен в своей схеме.

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