2013-12-09 4 views
2

ColdFusion의 XMLValidate() 함수를 사용하여 XML 문서의 유효성을 ONIX XSD Schema에 대해 확인하려고합니다. ONIX는 서적 출판 업계의 일부 측면에서 사용되는 '표준'XML 형식입니다.ColdFusion 10에서 XML 유효성 검사시 요소 선언을 찾을 수 없습니다.

이것은 샘플 XML 문서입니다 [Client 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> 

위의 문서를 스키마와 비교하여 검증하는 샘플 코드는 다음과 같습니다. 이 코드를 실행하려면 위의 링크에서 스키마를 다운로드하고 스키마 문서를 웹 서버의 루트 디렉토리에 압축을 풀어야합니다. 위의 XML을 sample.xml 파일로 저장하십시오. cffile 태그의 파일 경로를 수정해야 할 수도 있습니다. 내가 제대로 오류를 번역하면

[Error] :2:28: cvc-elt.1: Cannot find the declaration of element 'ONIXMessage'.

, 그것은이 ONIXMessage 태그를 찾을 수 없습니다 :

<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/> 

그것은이 오류를 제공합니다. 그러나, 나는 왜 오히려 혼란 스럽습니다.

나는 간단한 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 또는 CFs 유효성 검사 기능에 오류가 있는지를 확인하려고합니다.

본 사람이 있습니까? 누구든지 어떤 통찰력을 가지고 있습니까? 의견을 바탕으로


,이 추가 싶어 :이 디버그 도움이된다면 나는 아무 생각이

을;

<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 참조를 제거 :하지만 난 XML 헤더를 변경하는 경우이 참조하기가 유효한 것 같다 있지만

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

내가 다른 오류의 회전을 얻는다. ONIXMessage의 선언을 찾는 데 문제가 없습니다. 하지만 다른 많은 오류를 강조 표시합니다. [그들이 아직 유효한지 확실치 않습니다.]

우리 환경에서 XML 문서의 스키마 위치를 "하드 코딩"해야하는 것은 현실적이지 않습니다.

+1

이미 알고 있을지 모르지만 [온라인 ONIX 파일 검사기] (http://www.readyet.net/tools/onixFileValidation/3)를 발견했습니다. 이를 사용하여 ColdFusion 외부의 XML/XSD를 확인할 수 있습니다. 게시 한 샘플을 시도했지만 여기서 수정 한 부분 인 'TitleText'에 실패했습니다. 해당 사이트에서 실제 버전을 사용해 볼 수 있는지, 아니면 프로덕션과 유사한 데이터로 적어도 하나를 시도 할 수 있는지는 확실치 않습니다. –

+1

@ Miguel-F 나는 그것을 이미 알지 못했다. 링크를 가져 주셔서 감사합니다. 나는 "진짜"파일을 업로드 할 때보고있는 것과 같은 오류를 보게됩니다. 그러나 현재의 오류는 해결되지 않습니다. 어쩌면 문제는 CF의 유효성 검사 라이브러리에 있습니다. – JeffryHouser

+1

나는 링크가 최소한 XML을 확인해 주길 바랬다. 어떤 오류가 발생했는지에 대해 어떻게 생각하는지 확실하지 않습니다 (다른 오류가 있음에도 불구하고). 실제로 사용하고있는 XSD를 확실히 알 수는 없습니다. XSD를 다운로드하고 샘플 코드를 시도하여 동일한 결과를 얻는 지 확인합니다. 계속 지켜봐주십시오 ... –

답변

0

이 문제를 해결할 수있었습니다. 나는 몇 가지 일을해야했다. 나는이 포함 제거하고 일할 수있는 검증을 위해 하나의 파일로 세 개의 파일을 결합했다

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

:

첫째, 원래 스키마를 만들어 사용하는 다른 파일을 포함 포함되어 있습니다. 로컬 패스로 인해 파일을 찾는 밸리 데이터에서 문제가 발생했는지 또는 유효성 검사 루틴에 포함되어있는 문제인지 여부는 알 수 없습니다. 사용하지 않고 단일 스키마를 작성하면이 문제가 해결됩니다.

또한 XML 헤더에 스키마 위치를 추가해야했습니다.

<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/> 

파일을 만드는 프로세스가 변경되는 것을 방지하기 위해; 여는 태그를 찾기위한 정규식에 대한 this answer

<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) /> 

감사합니다 : 우리는 검증을 수행하기 전에 나는 "즉시"헤더에 스키마 정보를 추가하려면이 코드를 사용하고 있습니다.