我已经制作了一个XML模式来验证传入的xml文件,以验证它们是否为错误。 我有一些代码应该在xml文件有效时返回true,否则返回false。 我还制作了两个XML文件,其中一个是有效的,另一个是无效的。但是,我的代码对它们都返回true,并认为它们都是有效的。怎么会?我哪里做错了?
架构:
的 XMLSchemaError.xsd
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchemaError"
targetNamespace="http://tempuri.org/XMLSchemaError.xsd"
elementFormDefault="qualified"
xmlns="http://tempuri.org/XMLSchemaError.xsd"
xmlns:mstns="http://tempuri.org/XMLSchemaError.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
<xs:element name="Error">
<xs:complexType>
<xs:sequence>
<xs:element name="Server_ID" type="xs:integer" />
<xs:element name="Prioritizing" type="xs:token" />
<xs:element name="Type" type="xs:token" />
<xs:element name="Thrown_by" type="xs:token" />
<xs:element name="Code" type="xs:string" />
<xs:element name="Text" type="xs:string" />
<xs:element name="Time_occured" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
验证XML文件的代码:
的 XMLValidation.cs
private bool isValid = false;
public bool checkValid(string fileName)
{
try
{
var reader = XmlReader.Create("../../XMLFiles/" + fileName);
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(reader);
doc.Schemas.Add(null, "../../Model/XMLSchemaError.xsd");
doc.Validate(ValidationCallBack);
isValid = true;
}
catch
{
isValid = false;
}
System.Diagnostics.Debug.WriteLine("Check: " + isValid);
return isValid;
}
private void ValidationCallBack(object sender, ValidationEventArgs e)
{
throw new Exception();
}
要验证的2个XML文件:
的 Valid.xml
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Server_ID>4</Server_ID>
<Prioritizing>major</Prioritizing>
<Type>test error</Type>
<Thrown_by>test program</Thrown_by>
<Code></Code>
<Text></Text>
<Time_occurred>2016-02-9T12:34:56.7890</Time_occurred>
</Error>
Invalid.xml
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
答案 0 :(得分:2)
正如评论者Damien_The_Unbeliever所指出的那样,由于您的XML并未声明包含由相关模式验证的任何元素,因此这两个文档都会通过验证。他们没有任何东西可以验证。
有多种方法可以纠正这种情况。最简单的方法是只向源元素添加一个默认的XML命名空间。 E.g:
<?xml version="1.0" encoding="UTF-8"?>
<note xmlns="http://tempuri.org/XMLSchemaError.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
完成此操作后,上述XML现在将根据您的架构验证失败。
如果您对“有效”XML执行相同的操作,您会发现它也无法通过验证。这有两个原因:
dateTime
格式不正确。仅使用一个数字指定日期字段,但XML格式要求月份和日期字段都有两位数字。考虑到您提供的架构,实际有效的XML将如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Error xmlns="http://tempuri.org/XMLSchemaError.xsd">
<Server_ID>4</Server_ID>
<Prioritizing>major</Prioritizing>
<Type>test error</Type>
<Thrown_by>test program</Thrown_by>
<Code></Code>
<Text></Text>
<Time_occured>2016-02-09T12:34:56.7890</Time_occured>
</Error>
(我选择拼错XML中的元素名称,而不是修复架构,只是因为它简化了本答案中所需的示例XML :)。