2010-03-07 4 views
5

Stworzyłem najprostszą usługę internetową w C#:Jak skompilować schemat korzystający z DataSet (xs: schema)?

public void AddData(DataSet ds) 

Wygenerowany schematu (WSDL) wygląda następująco:

<s:schema xmlns:s="http://www.w3.org/2001/XMLSchema"> 
... 
<s:element ref="s:schema" /> 
... 
</s:schema> 

Uwaga schemat nie zawiera żadnych import/zawierać elementy.

Próbuję załadować ten schemat AC# System.Xml.XmlSchema i dodać go do System.Xml.XmlSchemaSet:

var set = new XmlSchemaSet(); 
var fs = new FileStream(@"c:\temp\schema.xsd", FileMode.Open); 
var s = XmlSchema.Read(fs, null); 
set.Add(s);    
set.Compile(); 

Ostatnia linia generuje ten wyjątek:

The 'http://www.w3.org/2001/XMLSchema:schema' element is not declared. 

To ma sens: Schemat generowany przez .Net używa typu "s: schema", który jest zadeklarowany w schemacie, który nie jest importowany.

  1. Dlaczego .Net tworzy niepoprawny schemat?
  2. Jak skompilować schemat mimo to? Skoro tak, to pobierz schemat w wersji http://www.w3.org/2001/XMLSchema i dodaj go również do XmlSchemaSet. To nie działało, ponieważ ten schemat online zawiera definicję DTD. Musiałem ręcznie usunąć i teraz wszystko działa. Czy to ma sens, czy coś mi brakuje?

Odpowiedz

2
  1. Nazwałbym to błędem. Jednak bardzo rzadko można zobaczyć elementy odwołujące się do schematu XML z przestrzeni nazw http://www.w3.org/2001/XMLSchema.
  2. To, co zrobiłeś, to właściwa droga - prawie; ogólnie rzecz biorąc, powinieneś być w stanie skompilować plik XML Schema, który używa odwołania DOCTYPE; po prostu upewnij się, że DTD jest dostępny w określonej lokalizacji (lub jest dostępny przez program tłumaczący XML), a ustawienia czytnika skonfigurowano tak, aby nie blokowały przetwarzania DTD (albo przestarzałe właściwości ProhibitDtd, albo DtdProcessing w XmlReaderSettings, domyślnie są to wartości true).
-1

Oznacza to, że usługa nie ma wystarczających informacji do zbudowania sensownego formatu elementów, więc generuje WSDL zasadniczo mówiąc: "Wyślę jakiś plik XML, ale nie wiem, jak będzie wyglądać lubić." Musimy bardziej rozbudować strukturę usługi, aby generator WSDL mógł stworzyć sensowny schemat.

+0

Nie, to znaczy, że usługa zwraca 'DataSet'. To nie jest dobry pomysł. Jak można oczekiwać, że klient Java poradzi sobie z 'DataSet'. Zasadniczo nie należy używać żadnych typów specyficznych dla .NET w umowie usługi internetowej. –