在网上找了很多用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);
}
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);
}
解决方案 »
- 如何让控制台程序一直执行不停止
- 一段代码不会写
- 100分,100分,100分!!!挂一天在线等~~~高手来解决了
- 算法大擂台:看看谁的算法效率最高(用时最短),把一串数字转化为随机字母(数字在20位以上)
- 为什么没有con.open()还能操作数据库?
- 下面这段函数重载有什么问题吗?
- 请高手和版主们帮我解决一个困惑我多天的问题!!怎么响应TreeView控件的事件问题?详细内容请看正文?多谢
- 我实在受不了。Net了,我是做Winform的,用。NET作的Winform程序又慢又大,客户的机器又老,客户很不满意,
- 如何制作一个象微软百科全书(ENCARTA)这样的软件,或者和MSDN这样的软件,是否有例子能够提供,希望大家来讨论
- 水晶报表可以只显示一条记录吗?
- 验证问题
- vs 2008 对JS不能智能提示
XmlReader reader = XmlReader.Create(Server.MapPath(fuXml.FileName), settings);fuXml是什么东西
targetNamespace="VirtualSchema"这行去掉代码里面
settings.Schemas.Add("VirtualSchema", Server.MapPath("XMLSchema.xsd"));
这句改成
settings.Schemas.Add(null, Server.MapPath("XMLSchema.xsd"));试试看
fuXml是FileUpload控件。
按照你的回复内容修改了一下,还是不行:(
{
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出去了.