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 !!!!

DEMO

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-Validation成功执行,没有任何错误。 XSD中唯一允许使用的标签version,在XML中对V1_1的限制是V1_0

我创建了一个DEMO来重现这种有线行为。

在这里想念什么?我该怎么做才能使XSD验证按预期工作?

如果您将XSD和XML复制到例如this page验证将按预期失败。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...