2009-06-17 11 views
5

スキーマに対してXMLファイルを検証する必要があります。 XMLファイルはコードで生成されています。保存する前に、正しいものであることを検証する必要があります。XML検証がスキーマに対して失敗しているのはなぜですか?

私はこの問題を最優先要素から除外しましたが、問題が発生しています。

XML:

<?xml version="1.0" encoding="utf-16"?> 
<MRIDSupportingData xmlns="urn:GenericLabData"> 
    <MRIDNumber>MRIDDemo</MRIDNumber> 
    <CrewMemberIdentifier>1234</CrewMemberIdentifier> 
    <PrescribedTestDate>1/1/2005</PrescribedTestDate> 
</MRIDSupportingData> 

スキーマ:

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema xmlns="urn:GenericLabData" targetNamespace="urn:GenericLabData" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="MRIDSupportingData"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="MRIDNumber" type="xs:string" /> 
     <xs:element minOccurs="1" name="CrewMemberIdentifier" type="xs:string" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

ValidationCode:。(このコードは、私が検証ロジックをテストするために書いたシンプルなアプリからであるXMLおよびXSDファイルがディスク上に保存され、実際のアプリケーションでは、XMLファイルは既にXmlDocumentオブジェクトとしてメモリに格納されており、XSDは内部Webサーバーから読み取られます)。

private void Validate() 
{ 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.Schema; 
    //settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema; 
    //settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; 
    //settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.ValidationEventHandler += new ValidationEventHandler(OnValidate); 

    XmlSchemaSet schemas = new XmlSchemaSet(); 
    settings.Schemas = schemas; 
    try 
    { 
    schemas.Add(null, schemaPathTextBox.Text); 
    using (XmlReader reader = XmlReader.Create(xmlDocumentPathTextBox.Text, settings)) 
    { 
     validateText.AppendLine("Validating..."); 
     while (reader.Read()) ; 
     validateText.AppendLine("Finished Validating"); 
     textBox1.Text = validateText.ToString(); 
    } 
    } 
    catch (Exception ex) 
    { 
    textBox1.Text = ex.ToString(); 
    } 

} 

StringBuilder validateText = new StringBuilder(); 
private void OnValidate(object sender, ValidationEventArgs e) 
{ 
    switch (e.Severity) 
    { 
    case XmlSeverityType.Error: 
     validateText.AppendLine(string.Format("Error: {0}", e.Message)); 
     break; 
    case XmlSeverityType.Warning: 
     validateText.AppendLine(string.Format("Warning {0}", e.Message)); 
     break; 
    } 
} 

I上で定義されたXMLおよびXSDファイルで上記のコードを実行し、この出力を得る:

Validating... Error: The element 'MRIDSupportingData' in namespace 'urn:GenericLabData' has invalid child element 'MRIDNumber' in namespace 'urn:GenericLabData'. List of possible elements expected: 'MRIDNumber'. Finished Validating

私は何をしないのですか?私の知る限り、MRIDNumberはMRIDNumberなので、なぜそのエラーですか?

実際のXMLファイルはXSDと同じくらい大きくなっていますが、最初は失敗していますので、ほとんど問題はありません。

これについての助力は素晴らしいことです。

XML::

<?xml version='1.0'?> 
<bookstore xmlns="urn:bookstore-schema"> 
    <book genre="novel"> 
    <title>The Confidence Man</title> 
    <author> 
     <first-name>Herman</first-name> 
     <last-name>Melville</last-name> 
    </author> 
    <price>11.99</price> 
    </book> 
</bookstore> 

はスキーマ:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="urn:bookstore-schema" 
    elementFormDefault="qualified" 
    targetNamespace="urn:bookstore-schema"> 
    <xsd:element name="bookstore"> 
    <xsd:complexType> 
     <xsd:sequence > 
     <xsd:element name="book" maxOccurs="unbounded"> 
      <xsd:complexType> 
      <xsd:sequence > 
       <xsd:element name="title" type="xsd:string"/> 
       <xsd:element name="author"> 
       <xsd:complexType> 
        <xsd:sequence > 
        <xsd:element name="first-name" type="xsd:string"/> 
        <xsd:element name="last-name" type="xsd:string"/> 
        </xsd:sequence> 
       </xsd:complexType> 
       </xsd:element> 
       <xsd:element name="price" type="xsd:decimal"/> 
      </xsd:sequence> 
      <xsd:attribute name="genre" type="xsd:string"/> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence>  
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

答えて

6

elementFormDefault="qualified"属性をXSDファイルのxs:schema要素に追加してみてください。

MRIDNumber要素の代わりに、名前空間がの代わりにMRIDNumber要素が必要であると言っていると思います。

+0

試してみるとうまくいきます。なぜこれで問題は解決しますか? –

+0

私の答えで編集:あなたのXSDの以前のバージョンでは、MRIDNumber要素は修飾されていませんでした(ターゲット/デフォルト名前空間に属していません)。このリンクを参照してください:http://www.xfront.com/DefaultNamespace.html –

+0

PS:それが動作する場合は、同じ問題を抱えているときに他のユーザーが見つけることができるように、このポストをあなたの質問に対する回答として示してください... –

1

はところで、これらのファイルが作業を行う
キース


をありがとうXML/XSDの小さな抜粋では、現在テスト中です。 XSDにPrescribedTestDateも含めましたか?

+0

PrescribedTestDateがXMLファイルにあるかどうかは関係ありません。エラーは同じで、MRIDNumber要素で停止します。 –

+0

問題がPrescribedTestDateの場合にMRIDNumberを参照するエラーが発生する理由がわかりませんが、生成されたXMLと動作中のXML(XSDと同様)に表示される違いは、動作中のXMLもXSDにPrescribedTestDateが含まれています。私はそれがそこにあることを確認して、エラーが消えるかどうかを確認したいと思います。 – AllenG

+0

問題はPrescribedTestDateではありませんでした。 –