没有Unicode字节顺序标记。无法切换到Unicode。

13 浏览
0 Comments

没有Unicode字节顺序标记。无法切换到Unicode。

我正在使用XSD编写一个XML验证器。\n以下是我所做的,但是当验证器到达while (list.Read())这行时,它给我一个错误:\n

\n没有Unicode字节顺序标记。无法切换到Unicode。\n

\n有人能帮我修复吗?\n

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( "警告: ");
                MessageBox.Show(e.Message);
            }
            else if (e.Severity == XmlSeverityType.Error)
            {
                MessageBox.Show("错误: ");
                MessageBox.Show(e.Message);
            }
        }
    }

\n

XML

\n



  

\n

XSD

\n



  
    
      
        
          
            
              
                
              
            
          
        
        
          
            
              
                
              
            
          
        
      
      
    
  

0
0 Comments

在XML头部声明使用UTF-16编码,但实际上并未以此编码保存文件时,会出现此错误。可以使用简单的Windows记事本进行检查,点击"另存为",然后在底部检查xml文件的编码(可能仍然是UTF-8,而不是UTF-16)。

以下是解决方法:

1. 打开XML文件,确保文件在UTF-16编码下保存。

2. 如果文件在UTF-8编码下保存,将其转换为UTF-16编码。

3. 使用文本编辑器(例如Sublime Text、Notepad++等),打开XML文件。

4. 在文件的第一行添加以下代码:``。

5. 保存文件并重新运行程序,问题应该会得到解决。

希望以上方法能够帮助解决出现"There is no Unicode byte order mark. Cannot switch to Unicode"问题的原因和解决方法。

0
0 Comments

出现(There is no Unicode byte order mark. Cannot switch to Unicode)这个问题的原因是xml文件的编码格式不支持Unicode,无法切换到Unicode编码。解决方法是直接以原始的xml内容的形式读取,而不是使用xml路径加载xml文件。如果使用XmlDocument,则可以使用LoadXml方法直接加载xml内容,而不是使用File.ReadAllText方法。在读取文件时,不要使用File.ReadAllText方法,而是应该使用StreamReader和FileStream来读取文件,避免将整个文件读入内存。对于已知的小文件,如设置文件等,使用File.ReadAllText方法是可以接受的。

以下是整理后的文章:

如果无法更改xml文件的编码格式为Unicode:


可以选择直接以原始的xml内容的形式读取,而不是使用xml路径加载xml文件:

XmlReader.Create(new StringReader(File.ReadAllText(fileName)));

如果使用XmlDocument:

var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(File.ReadAllText(filePath));

不要使用File.ReadAllText方法。应该始终使用StreamReader和FileStream来读取文件,避免将整个文件读入内存。对于已知的小文件,如设置文件等,使用File.ReadAllText方法是可以接受的。

0
0 Comments

在处理XML文件时,可能会遇到错误消息"There is no Unicode byte order mark. Cannot switch to Unicode"。这个错误的原因是文件的实际编码与XML声明中指定的编码不一致。比如,如果文件实际上使用的是单字节字符,声明为encoding="utf-16"并不能将其转换为双字节字符。

为了解决这个问题,可以尝试移除XML声明中的编码信息,将:

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

替换为:

<?xml version="1.0"?>

另外,你也可以尝试使用LoadXML()方法将文件加载为字符串来绕过这个问题。

此外,如果将XML声明改为<?xml version="1.0" encoding="utf-8"?>可能也能解决问题。因为utf-8是默认的编码方式。

在遇到类似错误后,某些情况下了一个解决方法。在他的情况下,他首先通过编程方式创建了XML,然后在之后的某个时间点读取和写入该文件。如果你想要通过xmlwriter来移除或更改处理指令中的编码版本,可以使用writer.WriteProcessingInstruction("xml", "version='1.0'");(其中writerXmlWriter的实例)。详见msdn文档

对于一些人来说,通过将文件加载为字符串的方法也解决了问题。但问题是,这种解决方法是否安全可行就不得而知了。

0