2012-03-26 12 views
2

実行時にxmlファイルを読み込むコードに取り組んでいます。その分、XmlDocument型を使用してxmlファイルを読み込み、SelectSingleNodeステートメントの周りにtry-catchをラップします(これは、ノードがnullであるか、ユーザーを解析しているときには存在しません作成されたxmlファイル)。C#でスキーマを使用してXMLを解析する

ご注意:XmlDocumentがXDocumentに置き換えられたことを認識しています。しかし、.NETバージョン3(according to this MSDN document XDocumentは.NET 3では使用できません)で作業しているので、現在はXmlDocumentを使用しています。私たちはさまざまな理由で.NET 3を使用しています(いくつかは仕様に関連しています)。上記の例で明らかに

private void LoadUserXMLFile() 
{ 
    XmlDocument xDoc = new XmlDocument(); 
    XmlTextReader reader = new XmlTextReader(fileName); 
    reader.Read(); 
    xDoc.Load(reader); 

    try { firstElementString = xDoc.SelectSingleNode(<path to node>).InnderText); 
    catch { <exception handling here > } 
    //more SelectSingleNode statements, each wrapped inside 
    //individual try-catch blocks 
} 

、と私はcatch文を簡素化しました:

は、ここでは、分でやっていることの一例です。

このアプリケーションで動作するユーザー生成のXMLファイルのスキーマを作成しました。XML文書の解析中にスキーマを使用したかどうかは疑問でしたが、まだラップする必要がありますそれぞれのSelectSingleNodeはtry-catch文を使用していますか?

構文解析中にスキーマを使用してXML文書が正しい形式とすべての必須要素を持つことを確認することも可能ですか?

答えて

2

はい、あなたは明らかにあなたのXMLがXMLで(ようへの参照が解決されたかthatsのスキーマを参照します。この

XmlTextReader r = new XmlTextReader("C:\\Xml\\MyXmlFile.xml"); 
v.ValidationType = ValidationType.Schema; 

のようなものを使用することができます検証リーダー

を使用する必要がありますあなたは、XMLを変更することはできません場合は、この

のようなXmlReaderSettingsを使用することができますので、

<Employee EmployeeId="12345566" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation="Employee.xsd"> 
    <PersonName>Krystan</PersonName> 
</Employee> 

のように自分自身)

public void SomeMethod() 
{ 
    XmlReaderSettings xmlsettings = new XmlReaderSettings(); 
    xmlsettings.Schemas.Add("http://www.company.com/blah", "blah.xsd"); 
    xmlsettings.ValidationType = ValidationType.Schema; 
    xmlsettings.ValidationEventHandler += new ValidationEventHandler(ValidationHandler); 

    XmlReader reader= XmlReader.Create("somefile.xml", xmlsettings); 

    while (reader.Read()) { } 
} 

public void ValidationHandler(object sender, ValidationEventArgs args) 
    void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e) 
{ 
    if (e.Severity == XmlSeverityType.Warning) 
    { 
     Console.Write("WARNING: "); 
     Console.WriteLine(e.Message); 
    } 
    else if (e.Severity == XmlSeverityType.Error) 
    { 
     Console.Write("ERROR: "); 
     Console.WriteLine(e.Message); 
    } 
} 

あなたがスキーマに対して妥当性を確認し、そこにあると知られているノードを選択している場合は、ノードごとの例外ハンドリングを省くことができますが、明らかにファイルの負荷などのために起こる可能性のある例外。

関連する問題