c# - XML 验证成功但应该失败
问题描述
我将 XML 序列化与 XmlSerializer 一起使用。在阅读文档之前,我会尝试根据 XSD 对其进行验证,以确定要选择的正确版本。
验证成功 - 但应该失败!
我的验证码是:
var schemaSet = new XmlSchemaSet();
schemaSet.Add(null, XmlReader.Create(new StringReader(xsd)));
var document = XDocument.Load(new StringReader(xml));
var hasErrors = false;
document.Validate(schemaSet, (s, e) => hasErrors = true);
Console.WriteLine("Document has erros: {0}", hasErrors);
if (hasErrors == false)
Console.WriteLine("!!!! THIS DOCUMENT IS VALID !!!!");
输出是:
Document has erros: False
!!!! THIS DOCUMENT IS VALID !!!!
此外, MSDN建议的代码也将成功验证(也包含在 DEMO 中 - 已注释掉):
var settings = new XmlReaderSettings();
settings.Schemas.Add(null, XmlReader.Create(new StringReader(xsd)));
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;
settings.Schemas.Compile();
var contentReader = XmlReader.Create(new StringReader(xml), settings);
var document = new XmlDocument();
document.Load(contentReader);
var hasErrors = false;
document.Validate((s, e) => hasErrors = true);
Console.WriteLine("Document has erros: {0}", hasErrors);
if (hasErrors == false)
Console.WriteLine("!!!! THIS DOCUMENT IS VALID !!!!");
用于测试的 XSD 被剥离为仅包含一个属性的一种类型:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
targetNamespace="http://www.xxx.de/V1_1/LightningChartConfiguration"
elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xxx.de/V1_1/LightningChartConfiguration" xmlns:tns="http://www.xxx.de/V1/Common" xmlns:pref="http://www.xxx.de/V1/Triggers">
<xsd:element name="root" type="LightningChartConfigurationRoot_1_1"></xsd:element>
<xsd:complexType name="LightningChartConfigurationRoot_1_1">
<xsd:sequence>
<xsd:element name="Version" maxOccurs="1" minOccurs="1">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="V1_1"></xsd:enumeration>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
要测试的 XML 是:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xxx.de/LightningChartConfiguration">
<Version>V1_0</Version>
<LastChanged>2020-09-11T05:38:07.333359Z</LastChanged>
<Data>
<Discriminator>{DCA61812-A355-4709-A252-AC20EF7AE3E1}</Discriminator>
<Nodes>
<Node xsi:type="NodeChart_1_0">
<NodeId>365325c7-6cbd-4e29-af16-b044ee2a141f</NodeId>
<ImageIndex>3</ImageIndex>
<DisplayName>Chart</DisplayName>
<ValueType>DateTime</ValueType>
<TimeDisplayType>Absolute</TimeDisplayType>
<XAxisLabelsTimeFormat>HH:mm:ss:fff</XAxisLabelsTimeFormat>
<XAxisRange>10</XAxisRange>
<Trigger>
<IsActive xmlns="http://www.xxx.de/V1/Triggers">false</IsActive>
<StartingMode xmlns="http://www.xxx.de/V1/Triggers">Undefined</StartingMode>
<StoppingMode xmlns="http://www.xxx.de/V1/Triggers">Undefined</StoppingMode>
<Items xmlns="http://www.xxx.de/V1/Triggers" />
</Trigger>
<XAxisTitleVisible>true</XAxisTitleVisible>
<RefreshRate>15</RefreshRate>
<LegendBoxVisible>true</LegendBoxVisible>
<LegendBoxPosition>9</LegendBoxPosition>
</Node>
<Node xsi:type="NodeYAxis_1_0">
<NodeId>8af383f1-bf1a-4b1f-8cb4-bb2ee33a53be</NodeId>
<ImageIndex>4</ImageIndex>
<Parent>365325c7-6cbd-4e29-af16-b044ee2a141f</Parent>
<DisplayName>Y-Achse</DisplayName>
<AutoRange>true</AutoRange>
<From>0</From>
<To>10</To>
<Color>#FF008000</Color>
<ShowGridLines>false</ShowGridLines>
<YAxisTitleVisible>true</YAxisTitleVisible>
</Node>
<Node xsi:type="NodeSeries_1_0">
<NodeId>9f92503e-1cd7-4120-9602-0da6394db17a</NodeId>
<ImageIndex>1</ImageIndex>
<Parent>8af383f1-bf1a-4b1f-8cb4-bb2ee33a53be</Parent>
<DisplayName>Testing XXXXXX</DisplayName>
<Color>#FF00FF7F</Color>
<Width>1</Width>
<Pattern>Solid</Pattern>
<Scale>1</Scale>
<ShowInLegendBox>true</ShowInLegendBox>
<PhysicalDimension>NoDimension</PhysicalDimension>
<PhysicalUnit>NoUnit</PhysicalUnit>
<Data>Testing</Data>
</Node>
</Nodes>
</Data>
</root>
XML 显然太大了,并且包含更多 XSD 允许的标签。然而,XSD 验证成功,没有任何错误。XSD 中唯一允许的标记是它在 XML 中是version
有限制的。V1_1
V1_0
我创建了一个重现这种有线行为的演示。
我在这里想念什么?我需要做什么才能使 XSD 验证按预期工作?
如果您将 XSD 和 XML 复制到例如此页面,则验证将按预期失败。
解决方案
推荐阅读
- python - Pycharm 无法识别已编译的 .pyd,即使它在脚本运行时有效
- javascript - 找不到 FFMPEG,因为不再支持 FFMPEG 二进制文件
- sql - 删除带有外键的行时如何在数据库中保留一个条目
- javascript - 将点击发送到背景 div
- python - Selenium 找不到元素 Python
- html - 如何在文本周围放置一个框并允许用户使用 css 和 div 标签仅在段落上使用滚动条滚动
- html - 居中主导航并右对齐购物车
- wordpress - 您如何获得比默认 RSS 项目计数更多的返回项目,或者这是否可能?
- c++ - 指向纹理数据的指针 - 垂直翻转数据
- numpy - 一种在 2D numpy 数组中用 0 屏蔽特定索引后所有值的 Pythonic 方法