2013-12-09 72 views
2

我試圖使用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文檔中對模式位置進行「硬編碼」。

+1

您可能已經知道這一點,但我找到了一個[在線ONIX文件驗證程序](http://www.readyet.net/tools/onixFileValidation/3)。您可以使用它來驗證ColdFusion以外的XML/XSD。我嘗試了你發佈的樣本,但是失敗了,你修改後在這裏發佈的數據「TitleText」。不知道您是否可以在該網站上嘗試實際版本,或者至少有一個版本與更多類似生產的數據一樣。 –

+1

@ Miguel-F我不知道。感謝您的鏈接。當我上傳一個「真實」的文件時,我看到了與您所看到的相同的錯誤。但是,這並沒有解決當前的錯誤。也許這個問題真的存在於CF的驗證庫中。 – JeffryHouser

+1

我希望這個鏈接至少能爲你驗證XML。不知道該怎麼想它在那裏失敗(雖然有不同的錯誤)。無法確切地說出他們正在使用的XSD。大概是與版本3相同的一個。我將嘗試下載XSD並嘗試使用示例代碼來查看是否獲得相同的結果。敬請期待... –

回答

0

我能解決這個問題。我不得不做一些事情。

首先,原有的架構利用了包括包括其他文件:

<xs:include schemaLocation="ONIX_BookProduct_CodeLists.xsd"/> 
<xs:include schemaLocation="ONIX_XHTML_Subset.xsd"/> 

,我不得不刪除這些包括與三個文件合併成一個單一的文件進行驗證工作。我不知道這是驗證程序發現文件的問題 - 由於本地路徑 - 或驗證例程與包含的問題。創建一個沒有使用的模式解決了這個問題。我不得不將模式位置添加到XML Header。這是原文:

<ONIXMessage release="3.0"> 

而且這是經過修改的標題:

<ONIXMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" release="3.0" 
      xmlns="http://ns.editeur.org/onix/3.0/reference" 
      xsi:schemaLocation="http://ns.editeur.org/onix/3.0/reference http://mydomain.com/ONIX_BookProduct_3.0_reference.xsd"> 

然後驗證工作順利 - 或至少這似乎是;我仍然收到錯誤,但我覺得他們是我試圖驗證的XML文檔中的錯誤。

<cffile action="read" file="Sample.xml" variable="xmlFileResults" > 
<Cfset xmlValidateResults = xmlValidate(xmlFileResults) /> 
<cfdump var="#xmlValidateResults#" /><Br/><br/> 

爲了防止更改創建文件的過程;我使用此代碼的架構信息添加到「對飛」的標題,我們進行驗證之前:

<cfset sourceString = "<ONIXMessage ([^<>]+)?>" /> 
<cfset replacementString = "<ONIXMessage xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" release=""3.0"" xmlns=""http://ns.editeur.org/onix/3.0/reference"" xsi:schemaLocation=""http://ns.editeur.org/onix/3.0/reference #someVaraibleWithAbsoluteURLToOnixSchema#"">" /> 
<Cfset fileToValidate = REReplaceNoCase(fileToValidate, sourceString, replacementString) /> 

感謝this answer的正則表達式查找的開始標記。

相關問題