在网上找了很多用XSD验证XML文件的办法,但是我按照以下的做法做完后发现根不能实现我的要求。我随便找一个其他格式的XML文件也一样能通过验证。很是郁闷,希望各位朋友能帮忙忙看看我到底哪里写的不正确。谢谢了。
XSD文件<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="VirtualSchema"
    targetNamespace="VirtualSchema"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/OrderSchema.xsd"
    xmlns:mstns="http://tempuri.org/OrderSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:element name="Virtual">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Panorama">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="FullName" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Description" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>XML文件<?xml version="1.0" encoding="utf-8" ?>
<Virtual>
  <Panorama>
    <FullName>http://localhost:809/VirtualImages/01.jpg</FullName>
  </Panorama>
  <Description>
    <![CDATA[
    这里是描述信息,会有很多的内容。
    ]]>
  </Description>
</Virtual>验证方法        StringBuilder sb = new StringBuilder();        /// <summary>
        /// 验证XML文档。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void cmdVerify_Click(object sender, EventArgs e)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.ValidationType = ValidationType.Schema;
            //settings.Schemas = sc;
            settings.Schemas.Add("VirtualSchema", Server.MapPath("XMLSchema.xsd"));            settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler);            fuXml.SaveAs(Server.MapPath(fuXml.FileName));
            XmlReader reader = XmlReader.Create(Server.MapPath(fuXml.FileName), settings);
            string errorMessage = "这不是一个合乎规范的数据文件";            try
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Document && reader.NamespaceURI != "VirtualSchema")
                    {
                        Response.Write(errorMessage);
                        break;
                    }                }
                reader.Close();
            }
            catch (Exception ex)
            {
                sb.Append("<br>" + ex.Message);
            }
            finally
            {
                reader.Close();
            }            if (sb.Length == 0)
                lbl.Text = "该文档是合法的";
            else
                lbl.Text = sb.ToString();        }        void settings_ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            sb.Append("<br>" + e.Message);
        }

解决方案 »

  1.   

    fuXml.SaveAs(Server.MapPath(fuXml.FileName));
    XmlReader reader = XmlReader.Create(Server.MapPath(fuXml.FileName), settings);fuXml是什么东西
      

  2.   

    xsd里面
    targetNamespace="VirtualSchema"这行去掉代码里面
    settings.Schemas.Add("VirtualSchema", Server.MapPath("XMLSchema.xsd"));
    这句改成
    settings.Schemas.Add(null, Server.MapPath("XMLSchema.xsd"));试试看
      

  3.   


    fuXml是FileUpload控件。
    按照你的回复内容修改了一下,还是不行:(
      

  4.   

    private void cmdVerify_Click(object sender, EventArgs e)
            {
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.ValidationType = ValidationType.Schema;            settings.Schemas.Add(null, "XMLSchema.xsd");            settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);            XmlReader reader = XmlReader.Create("aa.xml", settings);
                string errorMessage = "这不是一个合乎规范的数据文件";            try
                {
                    while (reader.Read())
                    {                }
                    reader.Close();
                }
                catch (Exception ex)
                {
                    sb.Append("<br>" + ex.Message);
                }
                finally
                {
                    reader.Close();
                }            if (sb.Length == 0)
                    lbl.Text = "该文档是合法的";
                else
                    lbl.Text = sb.ToString();        }        StringBuilder sb = new StringBuilder();
            void settings_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
            {
                //throw new Exception("The method or operation is not implemented.");
                sb.Append("<br>" + e.Message + "\r\n");
            }
    我的调试代码,你看看是不是while里面break出去了.