我试图使用ColdFusion的XMLValidate()函数根据ONIX XSD Schema验证XML文档。 ONIX是图书出版业某些方面使用的“标准”XML格式。使用ColdFusion验证XML时找不到元素的声明10
这是一个示例XML文档[我为客户端NDA类型的原因修改了一些数据;抱歉的长度]
<?xml version="1.0"?>
<ONIXMessage release="3.0">
<Header>
<Sender>
<SenderName>Me</SenderName>
</Sender>
<SentDateTime>20131030T090000Z</SentDateTime>
<MessageNote>My Test for SO</MessageNote>
</Header>
<Product>
<RecordReference>12345</RecordReference>
<NotificationType>03</NotificationType>
<RecordSourceType>01</RecordSourceType>
<RecordSourceName>Me</RecordSourceName>
<ProductIdentifier>
<ProductIDType>15</ProductIDType>
<IDValue>12324567801011</IDValue>
</ProductIdentifier>
<DescriptiveDetail>
<ProductComposition>00</ProductComposition>
<ProductForm>ED</ProductForm>
<ProductFormDetail>E101</ProductFormDetail>
<ProductFormDetail>E127</ProductFormDetail>
<PrimaryContentType>10</PrimaryContentType>
<EpubTechnicalProtection>01</EpubTechnicalProtection>
<Collection>
<CollectionType>10</CollectionType>
<CollectionSequence>
<CollectionSequenceType>02</CollectionSequenceType>
<CollectionSequenceNumber>11</CollectionSequenceNumber>
</CollectionSequence>
<TitleDetail>
<TitleType>01</TitleType>
<TitleElement>
<TitleElementLevel>02</TitleElementLevel>
<TitlePrefix><![CDATA[The]]></TitlePrefix>
<TitleWithoutPrefix><![CDATA[Something]]></TitleWithoutPrefix>
</TitleElement>
</TitleDetail>
</Collection>
<TitleDetail>
<TitleType>01</TitleType>
<TitleElement>
<SequenceNumber>1</SequenceNumber>
<TitleElementLevel>01</TitleElementLevel>
<TitleText>
<![CDATA[ForSO]]>
</TitleText>
</TitleElement>
<TitleStatement><![CDATA[The Something for SO]]></TitleStatement>
</TitleDetail>
<Contributor>
<SequenceNumber>1</SequenceNumber>
<ContributorRole>A01</ContributorRole>
<PersonName>Me, Myself</PersonName>
<PersonNameInverted>Myself, Me</PersonNameInverted>
<NamesBeforeKey>Myself</NamesBeforeKey>
<KeyNames>Me</KeyNames>
</Contributor>
<Contributor>
<SequenceNumber>2</SequenceNumber>
<ContributorRole>A01</ContributorRole>
<PersonName>Someone Else</PersonName>
<PersonNameInverted>Else, Someone</PersonNameInverted>
<NamesBeforeKey>Someone</NamesBeforeKey>
<KeyNames>Else</KeyNames>
</Contributor>
<ContributorStatement>Me Myself and Someone Else</ContributorStatement>
<Language>
<LanguageRole>01</LanguageRole>
<LanguageCode>eng</LanguageCode>
</Language>
<Extent>
<ExtentType>00</ExtentType>
<ExtentValue>40</ExtentValue>
<ExtentUnit>03</ExtentUnit>
</Extent>
<Subject>
<MainSubject/>
<SubjectSchemeIdentifier>10</SubjectSchemeIdentifier>
<SubjectCode>JUV001000</SubjectCode>
</Subject>
<Audience>
<AudienceCodeType>01</AudienceCodeType>
<AudienceCodeValue>02</AudienceCodeValue>
</Audience>
<AudienceRange>
<AudienceRangeQualifier>17</AudienceRangeQualifier>
<AudienceRangePrecision>03</AudienceRangePrecision>
<AudienceRangeValue>8</AudienceRangeValue>
<AudienceRangePrecision>04</AudienceRangePrecision>
<AudienceRangeValue>12</AudienceRangeValue>
</AudienceRange>
</DescriptiveDetail>
<CollateralDetail>
<TextContent>
<TextType>03</TextType>
<ContentAudience>00</ContentAudience>
<Text textformat="02">
<![CDATA[Something, Something, Something, Dark Side]]>
</Text>
</TextContent>
</CollateralDetail>
<PublishingDetail>
<Imprint>
<ImprintName>Fake Publisher</ImprintName>
</Imprint>
<Publisher>
<PublishingRole>01</PublishingRole>
<PublisherName>Fake Publisher</PublisherName>
</Publisher>
<PublishingStatus>02</PublishingStatus>
<PublishingDate>
<PublishingDateRole>01</PublishingDateRole>
<DateFormat>00</DateFormat>
<Date>20110701</Date>
</PublishingDate>
<SalesRights>
<SalesRightsType>02</SalesRightsType>
<Territory>
<CountriesIncluded>GB AU NZ</CountriesIncluded>
</Territory>
</SalesRights>
<SalesRestriction>
<SalesRestrictionType>04</SalesRestrictionType>
<SalesOutlet>
<SalesOutletIdentifier>
<SalesOutletIDType>03</SalesOutletIDType>
<IDValue>AMZ</IDValue>
</SalesOutletIdentifier>
<SalesOutletName>Amazon</SalesOutletName>
</SalesOutlet>
<SalesOutlet>
<SalesOutletIdentifier>
<SalesOutletIDType>03</SalesOutletIDType>
<IDValue>BNO</IDValue>
</SalesOutletIdentifier>
<SalesOutletName>Barnes And Noble</SalesOutletName>
</SalesOutlet>
</SalesRestriction>
</PublishingDetail>
<ProductSupply>
<SupplyDetail>
<Supplier>
<SupplierRole>01</SupplierRole>
<SupplierName>Me</SupplierName>
</Supplier>
<ProductAvailability>20</ProductAvailability>
<Price>
<PriceAmount>12.99</PriceAmount>
<CurrencyCode>USD</CurrencyCode>
<Territory>
<CountriesIncluded>GB AU NZ</CountriesIncluded>
</Territory>
</Price>
</SupplyDetail>
</ProductSupply>
</Product>
</ONIXMessage>
这里是一些示例代码来验证上述文档对模式。要运行此代码,您必须从上面的链接下载该模式,并将架构文档解压缩到Web服务器的根目录中。将上述XML保存为名为sample.xml的文件;您可能必须修改cffile标签上的文件路径。
<cffile action="read" file="Sample.xml" variable="xmlFileResults" >
<Cfset xmlValidateResults = xmlValidate(xmlFileResults,'#cgi.http_host#/ONIX_BookProduct_3.0_reference.xsd') />
<cfdump var="#xmlValidateResults#" /><Br/><br/>
它提供了这样的错误:
[Error] :2:28: cvc-elt.1: Cannot find the declaration of element 'ONIXMessage'.
如果我正确翻译错误,它无法找到ONIXMessage标签。但是,我很困惑,为什么。
如果我参加一个简单的XML文件:
<?xml version="1.0"?>
<ONIXMessage release="3.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</ONIXMessage>
我仍然得到同样的错误。
我想确定它们是否是XML或XSD或CF验证功能的错误。
有没有人看到这个?有没有人有任何见解?
根据意见,我想补充一点:
我不知道,如果这有助于调试;但如果我改变XML标题引用此:
<ONIXMessage release="3.0" xmlns="http://ns.editeur.org/onix/3.0/reference"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ns.editeur.org/onix/3.0/reference http://myserver/ONIX_BookProduct_3.0_reference.xsd"
>
,并从XMLVALIDATE()函数删除XSD参考:
<cffile action="read" file="Sample.xml" variable="xmlFileResults" >
<Cfset xmlValidateResults = xmlValidate(xmlFileResults) />
<cfdump var="#xmlValidateResults#" /><Br/><br/>
我得到不同的错误的转换,但他们似乎有效。它不难找到ONIXMesessage的声明;但确实突出了很多其他错误。 [我不确定他们是否有效]。
不幸的是,在我们的环境中,不得不在XML文档中对模式位置进行“硬编码”。
您可能已经知道这一点,但我找到了一个[在线ONIX文件验证程序](http://www.readyet.net/tools/onixFileValidation/3)。您可以使用它来验证ColdFusion以外的XML/XSD。我尝试了你发布的样本,但是失败了,你修改后在这里发布的数据“TitleText”。不知道您是否可以在该网站上尝试实际版本,或者至少有一个版本与更多类似生产的数据一样。 –
@ Miguel-F我不知道。感谢您的链接。当我上传一个“真实”的文件时,我看到了与您所看到的相同的错误。但是,这并没有解决当前的错误。也许这个问题真的存在于CF的验证库中。 – JeffryHouser
我希望这个链接至少能为你验证XML。不知道该怎么想它在那里失败(虽然有不同的错误)。无法确切地说出他们正在使用的XSD。大概是与版本3相同的一个。我将尝试下载XSD并尝试使用示例代码来查看是否获得相同的结果。敬请期待... –