2015-04-28 10 views
17

Piszę walidator XML z XSDBrak oznaczenia kolejności bajtów w kodzie Unicode. Nie można przełączyć na Unicode

Poniżej jest to, co zrobiłem, ale kiedy dotarłem do linii while (list.Read()) daje mi błąd

There is no Unicode byte order mark. Cannot switch to Unicode. 

Czy ktoś może mi pomóc go naprawić?

public class Validator 
    { 
     public void Validate(string xmlString) 
     { 
      Boolean bRet = true; 

      string xmlPath = @"C:\x.xml"; 
      string xsdPath = @"C:\general.xsd"; 

      XmlReaderSettings Settings = new XmlReaderSettings(); 
      Settings.Schemas.Add("", xsdPath); 
      Settings.ValidationType = ValidationType.Schema; 
      Settings.ValidationEventHandler += new ValidationEventHandler(SettingsValidationEventHandler); 

      XmlReader list = XmlReader.Create(xmlPath, Settings); 

      //StringBuilder output = new StringBuilder(); 
      while (list.Read()) 
      { 
      } 

      //File.WriteAllText(@"D:\Output.xml", output.ToString()); 
     } 

     static void SettingsValidationEventHandler(object sender, ValidationEventArgs e) 
     { 
      if (e.Severity == XmlSeverityType.Warning) 
      { 
       MessageBox.Show("WARNING: "); 
       MessageBox.Show(e.Message); 
      } 
      else if (e.Severity == XmlSeverityType.Error) 
      { 
       MessageBox.Show("ERROR: "); 
       MessageBox.Show(e.Message); 
      } 
     } 

    } 

To jest mój XML:

<?xml version="1.0" encoding="utf-16"?> 
<FlashList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" vin="xxxxxxxxxxxxx"> 
    <flash ECUtype="xxx" /> 
</FlashList> 

I to jest moim XSD:

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="FlashList"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="flash" maxOccurs="unbounded" minOccurs="0"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
       <xs:attribute type="xs:string" name="ECUtype" use="optional"/> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="Error" maxOccurs="unbounded" minOccurs="0"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
       <xs:attribute type="xs:byte" name="code" use="optional" /> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute type="xs:string" name="vin"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+1

Czy jesteś pewien, że "fizyczny" plik x.xml jest poprawnie zakodowany? Otwórz go za pomocą edytora tekstowego, takiego jak Sublime lub jEdit, aby sprawdzić faktyczne kodowanie. – potame

+0

tak, zrobiłem ten plik XML po stronie serwera przy użyciu klasy wygenerowanej przez C# z tego samego pliku xsd i jest dobrze uformowany. ten kod jest po stronie klienta i po prostu chcę sprawdzić mój otrzymany plik xml z tym samym xsd po stronie klienta również – user3122648

Odpowiedz

35

Rzeczywistość kodowania pliku wydaje się być sprzeczny z podanego przez deklaracji XML. Jeśli twój plik faktycznie używa znaków jednobajtowych, deklarowanie encoding="utf-16" nie zmieni go na przykład na znaki dwubajtowe.

Spróbuj usunąć kodowanie będące w konflikcie z deklaracji XML. Wymienić

<?xml version="1.0" encoding="utf-16"?> 

z

<?xml version="1.0"?> 

Można również mieć możliwość załadowania pliku do łańcucha jako obejście, używając LoadXML().

+0

FWIW: ' Może rób tak samo. – LosManos

+1

Tak, ponieważ "utf-8" jest domyślnym kodowaniem. – kjhughes

+4

Po napotkaniu podobnego błędu, ta odpowiedź pomogła mi rozwiązać mój własny problem. W moim przypadku najpierw programowałem programowo xml, a potem czytałem i zapisywałem go w późniejszym czasie. Jeśli chcesz usunąć/zmienić wersję kodowania w instrukcji przetwarzania za pomocą 'xmlwriter', użyj' writer.WriteProcessingInstruction ("xml", "version = '1.0'"); '(z' writer' będącym instancją 'XmlWriter '). Zobacz [msdn doc] (https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writeprocessinginstruction (v = vs.110) .aspx) –