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

use*_*648 38 c# xml xsd xmlreader character-encoding

我正在用XSD编写XML验证器.

以下是我所做的,但当验证器到达该行时,while (list.Read())它会给我错误

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

任何人都可以帮我解决这个问题吗?

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);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

kjh*_*hes 67

文件编码的实际情况似乎与XML声明指定的内容冲突.如果您的文件实际上使用单字节字符,则声明encoding="utf-16"不会将其更改为使用双字节字符,例如.

尝试从XML声明中删除冲突的编码.更换

<?xml version="1.0" encoding="utf-16"?>
Run Code Online (Sandbox Code Playgroud)

<?xml version="1.0"?>
Run Code Online (Sandbox Code Playgroud)

您也可以使用LoadXML()将文件加载到字符串中作为解决方法.

  • 遇到类似错误后,这个答案帮我解决了自己的问题.在我的例子中,我首先以编程方式创建xml,然后在稍后读取和写入它.如果要使用`xmlwriter`删除/更改处理指令中的编码版本,请使用`writer.WriteProcessingInstruction("xml","version ='1.0'");`(``writer`是`XmlWriter的实例`).参见[msdn doc](https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.writeprocessinginstruction(v = vs.110).aspx) (10认同)
  • FWIW:`&lt;?xml version =“1.0”encoding =“utf-8”?&gt;`也可能可以解决问题。 (4认同)