XML / XSD с пространством имен - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть преобразованный XML, который я пытался проверить с помощью XSD, из которого он был создан.

Преобразованный XML:

<?xml version="1.0" encoding="UTF-8"?>
<ifp:Widget xmlns:ifp="Widget.xsd">
    <ifp:Foo>foo</ifp:Foo>
    <ifp:Bar>bar</ifp:Bar>
 </ifp:Widget>

XSD, из которого он был создан (на основе необработанного XML):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
 <xs:element name="Widget">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Foo" type='xs:string'/>
            <xs:element name="Bar" type='xs:string'/>
        </xs:sequence>
    </xs:complexType>
 </xs:element>
</xs:schema>

Я получаю сообщение об ошибке: cvc-elt.1: не удается найти объявление элемента 'ifp: Widget'.

Ответы [ 4 ]

1 голос
/ 02 февраля 2012

В вашей схеме не упоминается ни одно пространство имен с именем Widget.xsd.У XML вообще не должно быть пространств имен, т. Е. Просто <Widget>

Независимо от того, что сгенерировано, на что нужно обратить внимание в XML, оно не работает.схема, но это не относится к объявлению пространства имен в вашем XML.

0 голосов
/ 11 июня 2013

string xmlns: ifp = "Widget.xsd" может быть правильным.См. Wiki : спецификация не совсем предписывает точные правила для имен пространств имен (в ней прямо не говорится, что анализаторы должны отклонять документы, где имя пространства имен не является допустимым универсальным идентификатором ресурса), и многие синтаксические анализаторы XMLразрешить использование любой символьной строки.

Но ни один элемент в вашем XSD-файле не находится в этом пространстве имен.Элемент Rigth schema в вашем XSD-файле:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="Widget.xsd"
    elementFormDefault="qualified"> 
0 голосов
/ 02 февраля 2012

«XSD, из которого он был создан (основан на необработанном xml):» немного сбивает с толку .... Из контекста можно предположить, что был XSD (который вы перечисляете), из которого был сгенерирован XML, но Я не понимаю, что означает «на основе сырого XML» ... Вы говорите, что XSD был сгенерирован из чего-то? Или, что XSD был основан на «сыром xml» ... Другими словами, XSD, возможно, должен проверять XML, используемый в качестве входных данных для вашего преобразования?

В качестве еще одной опции для добавления к уже предоставленным ответам, вот XSD, который соответствует вашему преобразованному XML; разница здесь в том, что схема имеет целевое пространство имен, которое соответствует пространству имен, используемому вашим «преобразованным XML» ...

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema xmlns="Widget.xsd" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="Widget.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Widget">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="Foo" type="xsd:string" />
        <xsd:element name="Bar" type="xsd:string" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
0 голосов
/ 02 февраля 2012

Для правильной привязки вашего XML к XSD используйте что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<Widget xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.yourdomain.com Widget.xsd>
    <Foo>foo</Foo>
    <Bar>bar</Bar>
</Widget>

Если вам действительно нужно определить пространство имен с псевдонимом "ifp", сделайте что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<ifp:Widget xmlns:ifp="http://www.yourdomain.com/actualNamespace">
    <ifp:Foo>foo</ifp:Foo>
    <ifp:Bar>bar</ifp:Bar>
</ifp:Widget>

Вы можете использовать оба вместе, конечно.

...