2011-01-24 67 views
4

XML我有一个XML文档:如何验证对DTD

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE ONIXMessage SYSTEM "http://www.editeur.org/onix/2.1/reference/onix-international.dtd"> 
<ONIXMessage> 
    <Header> 
    <FromCompany>Companyy</FromCompany> 
    <SentDate>20101213</SentDate> 
    </Header> 
    <Product> 
    <RecordReference>153640</RecordReference> 
    <NotificationType>03</NotificationType> 
    <ProductIdentifier> 
     <ProductIDType>03</ProductIDType> 
     <IDValue>9785714009341</IDValue> 
    </ProductIdentifier> 
    <ProductForm>AC</ProductForm> 
    <NumberOfPieces>1</NumberOfPieces> 
    <ProductClassification> 
     <ProductClassificationType>02</ProductClassificationType> 
     <ProductClassificationCode>55101514</ProductClassificationCode> 
    </ProductClassification> 
    <Title> 
     <TitleType>01</TitleType> 
     <TitleText>Jazz Piano. Volume 3.</TitleText> 
    </Title> 
    <Contributor> 
     <SequenceNumber>1</SequenceNumber> 
     <ContributorRole>A01</ContributorRole> 
     <PersonName>Waller Fats</PersonName> 
     <PersonNameInverted>Fats, Waller</PersonNameInverted> 
     <TitlesBeforeNames> </TitlesBeforeNames> 
     <NamesBeforeKey>Waller</NamesBeforeKey> 
     <PrefixToKey> </PrefixToKey> 
     <KeyNames>Fats</KeyNames> 
     <SuffixToKey> </SuffixToKey> 
    </Contributor> 
    <Contributor> 
     <SequenceNumber>2</SequenceNumber> 
     <ContributorRole>A01</ContributorRole> 
     <PersonName>Peterson Oscar</PersonName> 
     <PersonNameInverted>Oscar, Peterson</PersonNameInverted> 
     <TitlesBeforeNames> </TitlesBeforeNames> 
     <NamesBeforeKey>Peterson</NamesBeforeKey> 
     <PrefixToKey> </PrefixToKey> 
     <KeyNames>Oscar</KeyNames> 
     <SuffixToKey> </SuffixToKey> 
    </Contributor> 
    <Contributor> 
     <SequenceNumber>3</SequenceNumber> 
     <ContributorRole>A01</ContributorRole> 
     <PersonName>Kenton Stan</PersonName> 
     <PersonNameInverted>Stan, Kenton</PersonNameInverted> 
     <TitlesBeforeNames> </TitlesBeforeNames> 
     <NamesBeforeKey>Kenton</NamesBeforeKey> 
     <PrefixToKey> </PrefixToKey> 
     <KeyNames>Stan</KeyNames> 
     <SuffixToKey> </SuffixToKey> 
    </Contributor> 
    <Contributor> 
     <SequenceNumber>4</SequenceNumber> 
     <ContributorRole>A01</ContributorRole> 
     <PersonName>Evans Bill</PersonName> 
     <PersonNameInverted>Bill, Evans</PersonNameInverted> 
     <TitlesBeforeNames> </TitlesBeforeNames> 
     <NamesBeforeKey>Evans</NamesBeforeKey> 
     <PrefixToKey> </PrefixToKey> 
     <KeyNames>Bill</KeyNames> 
     <SuffixToKey> </SuffixToKey> 
    </Contributor> 
    <Contributor> 
     <SequenceNumber>5</SequenceNumber> 
     <ContributorRole>A01</ContributorRole> 
     <PersonName>Shearing George</PersonName> 
     <PersonNameInverted>George, Shearing</PersonNameInverted> 
     <TitlesBeforeNames> </TitlesBeforeNames> 
     <NamesBeforeKey>Shearing</NamesBeforeKey> 
     <PrefixToKey> </PrefixToKey> 
     <KeyNames>George</KeyNames> 
     <SuffixToKey> </SuffixToKey> 
    </Contributor> 
    <Contributor> 
     <SequenceNumber>6</SequenceNumber> 
     <ContributorRole>A01</ContributorRole> 
     <PersonName>D. Ellington</PersonName> 
     <PersonNameInverted>Ellington, D.</PersonNameInverted> 
     <TitlesBeforeNames> </TitlesBeforeNames> 
     <NamesBeforeKey>D.</NamesBeforeKey> 
     <PrefixToKey> </PrefixToKey> 
     <KeyNames>Ellington</KeyNames> 
     <SuffixToKey> </SuffixToKey> 
    </Contributor> 
    <Contributor> 
     <SequenceNumber>7</SequenceNumber> 
     <ContributorRole>A01</ContributorRole> 
     <PersonName>Corea Chic</PersonName> 
     <PersonNameInverted>Chic, Corea</PersonNameInverted> 
     <TitlesBeforeNames> </TitlesBeforeNames> 
     <NamesBeforeKey>Corea</NamesBeforeKey> 
     <PrefixToKey> </PrefixToKey> 
     <KeyNames>Chic</KeyNames> 
     <SuffixToKey> </SuffixToKey> 
    </Contributor> 
    <Language> 
     <LanguageRole>01</LanguageRole> 
     <LanguageCode>rus</LanguageCode> 
    </Language> 
    <NumberOfPages>0</NumberOfPages> 
    <MainSubject> 
     <MainSubjectSchemeIdentifier>20</MainSubjectSchemeIdentifier> 
     <SubjectHeadingText>Nuotit, Jazz pianolle</SubjectHeadingText> 
    </MainSubject> 
    <OtherText> 
     <TextTypeCode>01</TextTypeCode> 
     <Text>Contents&lt;br&gt; 
Thomas «Fats» WALLER. Keepin' out of Mischief Now 
Oscar PETERSON. Whisper Not 
Stan KENTON. Painted Rhythm 
Oscar PETERSON. The Nearness of You 
Stan KENTON. Southern Scandal&lt;br&gt; Nat «King» COLE. Blues&lt;br&gt; Bill EVANS. Interplay (Blues F minor) 
Bill EVANS. Very Early 
George SHEARING. Changing with the Times 
Duke ELLINGTON. Echoes of Harlem 
Chick COREA. Gemini</Text> 
    </OtherText> 
    <MediaFile> 
     <MediaFileTypeCode>04</MediaFileTypeCode> 
     <MediaFileFormatCode>03</MediaFileFormatCode> 
     <MediaFileLinkTypeCode>01</MediaFileLinkTypeCode> 
     <MediaFileLink>9785714009341.jpg</MediaFileLink> 
     <MediaFileDate>20101220</MediaFileDate> 
    </MediaFile> 
    <ProductWebsite> 
     <ProductWebsiteLink>http://www.site.com/344.html</ProductWebsiteLink> 
    </ProductWebsite> 
    <Publisher> 
     <PublisherName>Muzyka</PublisherName> 
    </Publisher> 
    <CountryOfPublication>RU</CountryOfPublication> 
    <PublishingStatus>04</PublishingStatus> 
    <PublicationDate>2010</PublicationDate> 
    <SupplyDetail> 
     <SupplierName>Company</SupplierName> 
     <ProductAvailability>21</ProductAvailability> 
     <Price> 
     <PriceTypeCode>02</PriceTypeCode> 
     <PriceAmount>9.0000</PriceAmount> 
     <CurrencyCode>EUR</CurrencyCode> 
     <TaxRateCode1>S</TaxRateCode1> 
     <TaxRatePercent1>9</TaxRatePercent1> 
     </Price> 
    </SupplyDetail> 
    </Product> 
</ONIXMessage> 

验证码:

xml = "this XML document above"; 

    var r = new XmlTextReader(new StringReader(xml)); 
    var settings = new XmlReaderSettings(); 
    var sb = new StringBuilder(); 

    settings.ProhibitDtd = false; 
    settings.ValidationType = ValidationType.DTD; 
    settings.ValidationEventHandler += (a, e) => 
             { 
              sb.AppendLine(e.Message); 
              ret = false; 
             }; 

    XmlReader validator = XmlReader.Create(r, settings); 

    while (validator.Read()) 
    { 
    } 
    validator.Close(); 

我得到验证错误:

The element 'Product' has invalid child element 'Language'. List of possible elements expected: 'Contributor NumberWithinSeries YearOfAnnual ISBNOfSet EAN13OfSet ProductIdentifier TitleOfSet Title Set TextCaseFlag DistinctiveTitle TitlePrefix Title'.

但是,当我发这个XML到我的合作伙伴,他说文档不包含验证错误。 他们使用org.dom4j.io.SAXReader来验证它。 怎么可能?我是否正确地使用了减号?

回答

1

嗯,从我可以读取我会猜你的.dtd包含错误,而不是你的代码。您是否检查过.dtd是否包含<Language>的定义,它是小孩?

+0

这不是我的DTD。这是ONIX邮件的官方DTD http://www.editeur.org/8/ONIX/ – Lari13 2011-01-24 11:39:11