2009-08-20 2 views
0

У меня есть XML, который я хочу проверить в java.xml to xsd проблема преобразования

Единственная проблема, с которой я столкнулся, заключается в том, чтобы написать XSD для атрибута, который на самом деле является ссылкой на пространство имен. Невозможно использовать «< xs: attribute name =" xmlns "/>", потому что 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> 
+0

Я не думаю, что я понимаю, что вы пытаетесь здесь сделать.Предполагается ли xsd каким-то образом заставить документ объявить конкретное пространство имен? – jsight

+0

Мне нужно знать, что должен XSD для проверки XML. Мне все равно, что XML представляет, он всегда жестко закодирован таким же образом. Я не могу написать XSD, у которого нет предупреждений из-за этого атрибута пространства имен – 2009-08-23 13:40:28

ответ

0

'XMLNS' зарезервирован также Namespaces in XML 1.0.

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

+0

Мне нужно знать, что должен XSD для проверки XML. Мне все равно, что представляет собой XML, он всегда жестко закодирован таким же образом. Я не могу написать XSD, у которого нет предупреждений из-за этого атрибута пространства имен. – 2009-08-23 13:39:53

1

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

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

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> 
Смежные вопросы