我试图通过c#代码中的XSD验证XML。但是,它一直抛出一个XmlSchemaValidationException,,即“未声明'refname‘属性”。
执行验证的代码:
XmlReaderSettings xmlSettings = new XmlReaderSettings();
xmlSettings.Schemas = new System.Xml.Schema.XmlSchemaSet();
xmlSettings.Schemas.Add(null, @"\\[Network-drive path]\KVSchemaMod.xsd");
xmlSettings.ValidationType = ValidationType.Schema;
xmlSettings.DtdProcessing = DtdProcessing.Parse;
xmlSettings.ValidationFlags = XmlSchemaValidationFlags.AllowXmlAttributes;
xmlSettings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema;
xmlSettings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings;
XmlReader reader = XmlReader.Create(@"\\[Network-drive path]\KV_Article.xml", xmlSettings);
// Parse the file.
while (reader.Read()) ;XSD (删除重复的部分):
<?xml version="1.0" encoding="iso-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xs:annotation>
<xs:appinfo>
<sql:relationship name="ProductIdentifier"
parent="tblKVProduct"
parent-key="record_reference"
child="tblKVProductIdentifier"
child-key="record_reference" />
... (More SQL-mappings)
<xs:element name="ONIXMessage" sql:is-constant="1">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="Product" sql:relation="tblKVProduct">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="1" maxOccurs="1" name="RecordReference" sql:field="record_reference" >
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="0"/>
<xs:maxLength value="32"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
...(More elements under Product)待验证的XML (ONIX-标准):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ONIXMessage SYSTEM "http://www.editeur.org/onix/2.1/reference/onix- international.dtd">
<ONIXMessage>
<Product>
<RecordReference>0786606274</RecordReference>
<NotificationType>03</NotificationType>
<ProductIdentifier>
<ProductIDType>01</ProductIDType>
<IDTypeName>Kustantajan tuotenumero</IDTypeName>
<IDValue>95535</IDValue></ProductIdentifier>
<ProductIdentifier>
<ProductIDType>02</ProductIDType>
<IDValue>0786606274</IDValue></ProductIdentifier>
<ProductIdentifier>
<ProductIDType>03</ProductIDType>
<IDValue>9780786606276</IDValue>
</ProductIdentifier>
...(And more Product-fields)XML还有一个头标记作为ONIXMessage的第一个子标记(后面跟着所有作为ONIXMessage子元素的产品标记),但是由于在模式中没有引用任何字段,所以我看不出它们是如何导致这个特定错误的。
当我搜索XmlSchemaElement.RefName属性(MSDN定义)上的错误时,它甚至明确表示“如果包含的元素是模式元素,则不能设置值”。因为XSD就是这样的情况,我不明白为什么它会抛出一个关于它没有被声明的错误。
我一直在试图找出这是否与名称空间的缺乏有关,但在我看来,这应该不是问题,因为XML和XSD中都没有。或者,为了验证XML,需要将名称空间强制放到根元素上吗?
验证代码确实适用于另一组XML/XSD (尽管这些代码的构建非常不同),这是否只是一个侥幸,以及我验证的方式上的错误呢?
为了完成任务,XML中的头标记:
<Header>
<FromCompany></FromCompany>
<FromPerson></FromPerson>
<FromEmail></FromEmail>
<AddresseeIdentifier>
<AddresseeIDType></AddresseeIDType>
<IDTypeName></IDTypeName>
<IDValue></IDValue>
</AddresseeIdentifier>
<ToCompany></ToCompany>
<ToPerson></ToPerson>
<MessageNumber></MessageNumber>
<SentDate></SentDate>
<MessageNote></MessageNote>
</Header>发布于 2012-10-25 19:50:53
考虑到您还没有提供完整的示例,因此不可能重现您的问题。如果您想要基于推测以外的任何答案,您需要将您的模式和数据减少到说明问题的最小示例,因此问题答案者可以重现问题并更详细地研究它。当然,通常情况下,你的问题会在这个过程中消失,因为你会看到在寻找一个小问题的过程中出了什么问题。但这只是你必须冒的风险。
不过,尽管如此,我还是会继续猜测。几乎可以肯定,RefName对象上的XMLSchemaElement属性是红色鲱鱼。这条消息使它听起来更像是您要验证的XML在某个地方有一个名为refname的属性(在您省略的位中),而且您的XSD模式没有它的定义。当然,您提供的XSD片段没有它的定义。
然而,在http://www.editeur.org/onix/2.1/reference/onix-international.dtd中定义的词汇表(您在XML中所指)确实将refname定义为许多元素的属性(可能都是这些元素,尽管我没有单独检查每个元素)。因此,ONIXMessage元素可能包含具有refname属性的后代,这一点一点也不难以置信。
事实上,这并不是不可信的;它是肯定的。
XML所指向的DTD为所有元素(至少是我所见过的所有元素)提供了refname属性的默认值,而您的XSD模式声明似乎还没有准备好。也就是说,模式验证器看到的文档的第一个开始标记不是<ONIXMessage>,而是<ONIXMessage refname="ONIXMessage" shortname="ONIXmessage">。
如果您没有使用www.editeur.org提供的XSD,最简单的方法可能是重新考虑这个决定,并使用来自editeur.org的模式,而不是滚动自己的模式。它包括对refname和昵称属性的声明。如果您正在使用该模式,或者更确切地说,您试图使用它,那么某些事情发生了严重的错误,您的验证程序没有找到或读取它。在这种情况下,最好的方法是找出为什么您的系统找不到正确的架构文档。
https://stackoverflow.com/questions/13065348
复制相似问题