无效的 XML 显示为有效
Posted
技术标签:
【中文标题】无效的 XML 显示为有效【英文标题】:Invalid XML comes out as valid 【发布时间】:2016-02-15 14:39:27 【问题描述】:我已经创建了一个 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>
【问题讨论】:
您的架构描述了http://tempuri.org/XMLSchemaError.xsd
中的元素。您的任何 XML 都没有声称在任何命名空间中(即不使用任何 xmlns
属性)
好的。我对 XML 很陌生,你能告诉我如何将命名空间属性添加到 XML 文件中以使其工作吗?
【参考方案1】:
正如评论者Damien_The_Unbeliever 指出的那样,由于您的 XML 没有声称包含任何由相关架构验证的元素,因此这两个文档都可以轻松通过验证。他们没有什么可以验证的。
有多种方法可以纠正这种情况。最简单的方法是将默认 XML 命名空间添加到根元素。例如:
<?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 执行相同的操作,您会发现它也无法通过验证。这有两个原因:
-
架构拼错了单词“occurrred”,而 XML 没有。这可以通过更正架构的拼写或使用 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 :))。
【讨论】:
谢谢,这不仅解决了问题,而且我现在明白我做错了什么:)以上是关于无效的 XML 显示为有效的主要内容,如果未能解决你的问题,请参考以下文章