2013-05-17 6 views
8

FictionBook (znany również jako FB2) to oparty na XML format elektronicznych książek. Jego schemat można znaleźć tutaj:Dlaczego Visual Studio nie lubi tego schematu XML? (Przedrostek "" nie może zostać zamapowany na nazwę przestrzeni nazw zarezerwowanej dla "xml" lub "xmlns")

http://gribuser.ru/xml/fictionbook/2.0/xsd/

Jednak, kiedy pobrać ten schemat i próbował otworzyć go w programie Visual Studio 2012 Mam kilka błędów, z których pierwsza miała miejsce: przedrostek „” nie może być zmapowany na nazwę przestrzeni nazw zarezerwowanej dla "xml" lub "xmlns". Linia 5, pozycja 118. E: \ dev \ fb2 \ FictionBook2.xsd.

Czy schemat jest naprawdę nieważny? Jeśli tak, jak to możliwe, że wiele oprogramowania używa go do sprawdzania poprawności plików FB2? Czy istnieje prosty sposób modyfikacji schematu, aby VS był szczęśliwy?

+0

Problem rzeczywiście z http://gribuser.ru/xml/fictionbook/2.0/xsd/FictionBookLang. xsd.Pojawi się problem po prostu próba wyświetlenia go w przeglądarce. –

+0

I FYI Znalazłem to, próbując replikować swój problem przy użyciu klas .NET Framework. 'Xml.Schema.XmlSchema.Read (XmlReader.Create (" http://gribuser.ru/xml/fictionbook/2.0/xsd/FictionBookLang.xsd "), Nic)' odtwarza błąd. –

+0

Rozumiem, że to z powodu FictionBookLang.xsd, ale nadal nie mogę wymyślić, jak to naprawić. – thorn

Odpowiedz

5

Jedyną rzeczą, którą musisz zrobić, to usunąć xmlns="http://www.w3.org/XML/1998/namespace" z FictionBookLang.xsd, jako że jest jedynym winowajcą:

enter image description here

Autor zbioru najprawdopodobniej chciał upewnić się, że Atrybut xml: lang jest dostępny dla ludzi. To nie jest właściwa droga, ale mimo to może działać w pewnych sytuacjach.

Zazwyczaj robi się to inaczej. Jeśli procesor XML XSD świadomy jest „inteligentny”, taki import należy zrobić jak tak, to znaczy zamiast

<xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="FictionBookLang.xsd"/> 

powinno być:

<xs:import namespace="http://www.w3.org/XML/1998/namespace"/> 

To się nazywa zwisające odniesienia zewnętrzne; "inteligentne" procesory XSD wiedzą, jak rozdzielić lokalizacje na dobrze znane przestrzenie nazw (z pewnością jeden z nich to http://www.w3.org/XML/1998/namespace).

Tak właśnie powinien wyglądać zestaw po użyciu zwisającego importu; plik xml.xsd został automatycznie dodany przez procesor, a kopia powinna być wymieniona na liście here.

enter image description here

Innymi słowy, normalnie FictionBookLand.xsd NIE POWINNA być nawet częścią kompilacji. W szczególności, jeśli otrzymasz te XSD w połączeniu z innymi, które odnoszą się poprawnie do atrybutu xml: lang, otrzymasz błąd deklaracji duplikatu atrybutu.

W każdym razie, jeśli usuniesz tylko atrybut zgodny z opisem, wszystko staje się ważne; stamtąd można zbudować przykładowy XML - w przeciwieństwie do XSDs są w porządku. Próbka mam generowany jest ogromny, jestem delegowania tylko pierwsze kilka linii ...

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<FictionBook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:genre="http://www.gribuser.ru/xml/fictionbook/2.0/genres" xmlns="http://www.gribuser.ru/xml/fictionbook/2.0"> 
    <stylesheet type="type1">stylesheet1</stylesheet> 
    <description> 
     <title-info> 
      <genre match="100">architecture</genre> 
      <author> 
       <first-name xml:lang="en">first-name1</first-name> 
       <middle-name xml:lang="en">middle-name1</middle-name> 
       <last-name xml:lang="en">last-name1</last-name> 
       <nickname xml:lang="en">nickname1</nickname> 
       <home-page>home-page1</home-page> 
       <home-page>home-page1</home-page> 
       <email>email1</email> 
       <email>email1</email> 
      </author> 
      <book-title xml:lang="en">book-title1</book-title> 
      <annotation id="ID1" xml:lang="en"> 
1

Myślę, że problem może dotyczyć atrybutów targetNamespace=http://www.gribuser.ru/xml/fictionbook/2.0" i xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" w otwierającym tagu. Uruchamianie xmllint --schema FictionBook2.xsd --auto daje następujący błąd:

FictionBookLang.xsd:3: namespace error : xml namespace URI cannot be the default namespace 
="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/XML/1998/namespace" 

Usunięcie tych atrybutów pozbył się tych błędów, choć nie był w stanie w pełni skutecznie zmusić xmllint do generowania przykładowy plik XML.

+0

Spróbuj usunąć 'xmlns =" ​​... "', a nie 'targetNamespace =" ... "' too. –

Powiązane problemy