首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XML验证XSD失败,原因是“refname”未声明,尽管架构不允许使用refname

XML验证XSD失败,原因是“refname”未声明,尽管架构不允许使用refname
EN

Stack Overflow用户
提问于 2012-10-25 09:16:36
回答 1查看 1K关注 0票数 0

我试图通过c#代码中的XSD验证XML。但是,它一直抛出一个XmlSchemaValidationException,,即“未声明'refname‘属性”。

执行验证的代码:

代码语言:javascript
复制
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 (删除重复的部分):

代码语言:javascript
复制
<?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-标准):

代码语言:javascript
复制
<?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中的头标记:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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和昵称属性的声明。如果您正在使用该模式,或者更确切地说,您试图使用它,那么某些事情发生了严重的错误,您的验证程序没有找到或读取它。在这种情况下,最好的方法是找出为什么您的系统找不到正确的架构文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13065348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档