我試圖使用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並嘗試使用示例代碼來查看是否獲得相同的結果。敬請期待... –