2013-12-09 44 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的正则表达式查找的开始标记。

相关问题