【发布时间】:2017-07-05 15:45:21
【问题描述】:
System.ArgumentNullException:值不能未定义
堆栈跟踪:
at System.Xml.Linq.XAttribute..ctor(XName name, Object value)
at System.Xml.Schema.XNodeValidator.ValidateAttributes(XElement e)
at System.Xml.Schema.XNodeValidator.ValidateElement(XElement e)
at System.Xml.Schema.XNodeValidator.ValidateNodes(XElement e)
at System.Xml.Schema.XNodeValidator.ValidateElement(XElement e)
at System.Xml.Schema.XNodeValidator.Validate(XObject source, XmlSchemaObject partialValidationType, Boolean addSchemaInfo)
at System.Xml.Schema.Extensions.Validate(XDocument source, XmlSchemaSet schemas, ValidationEventHandler validationEventHandler, Boolean addSchemaInfo)
源代码:
var xmlPath = @"C:\XSDTEST\test.xml";
XDocument doc = XDocument.Load(xmlPath);
XmlSchemaSet xss = new XmlSchemaSet();
xss.Add("",@"C:\XSDTEST\test.xsd");
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.ValidationType = ValidationType.Schema;
xrs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
xrs.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation;
xrs.ValidationFlags |= XmlSchemaValidationFlags.ProcessIdentityConstraints;
xrs.Schemas = xss;
doc.Validate(xss, new ValidationEventHandler((s, args) => { }), true);
test.xsd:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Child1" minOccurs="1" maxOccurs="1"/>
<xsd:element ref="Child2" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Child2" type="Child2ElemType"/>
<xsd:complexType name="Child2ElemType">
<xsd:attribute ref="align" default="left"/>
</xsd:complexType>
<xsd:attribute name="align" type="alignAttType"/>
<xsd:simpleType name="alignAttType">
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="left"/>
<xsd:enumeration value="right"/>
<xsd:enumeration value="center"/>
<xsd:enumeration value="justify"/>
<xsd:enumeration value="char"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
test.xml:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="file:///C:/XSDTEST/test.xsd">
<Child1/>
<Child2/>
</Root>
问题:default="left":
<xsd:attribute ref="align" default="left"/>
我认为验证过程会尝试使用默认值创建一个“对齐”属性,但 XAttribute 构造函数为空,而不是“左”。
如果我将默认值设置为<xsd:attribute name="align" type="alignAttType" default="left"/>,它可以正常工作。
如果我将默认值设置为<xsd:attribute ref="align" default="left"/>,我会收到错误消息。
我可以在验证过程中禁用使用默认值创建属性吗?
或
正确处理默认值的设置是什么?
【问题讨论】:
标签: c# .net xsd-validation