私はXmlSerializerを使用してXml文書を逆シリアル化しています。しかし、クラスxsd.exeが生成されたクラスはxmlを読み取る機能しか提供していませんが、検証はできません。たとえば、ドキュメント内に1つのノードがない場合、期待されるように検証例外をスローするのではなく、生成されたクラスの属性フィールドがnullになります。それをどうすれば実現できますか?ありがとう!xmlserializerの検証
答えて
次のコードは、逆シリアル化中にスキーマに対して検証する必要があります。シリアライズ中に同様のコードを使用してスキーマに対して検証することができます。
private static Response DeserializeAndValidate(string tempFileName)
{
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add(LoadSchema());
Exception firstException = null;
var settings = new XmlReaderSettings
{
Schemas = schemas,
ValidationType = ValidationType.Schema,
ValidationFlags =
XmlSchemaValidationFlags.ProcessIdentityConstraints |
XmlSchemaValidationFlags.ReportValidationWarnings
};
settings.ValidationEventHandler +=
delegate(object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
{
Console.WriteLine(args.Message);
}
else
{
if (firstException == null)
{
firstException = args.Exception;
}
Console.WriteLine(args.Exception.ToString());
}
};
Response result;
using (var input = new StreamReader(tempFileName))
{
using (XmlReader reader = XmlReader.Create(input, settings))
{
XmlSerializer ser = new XmlSerializer(typeof (Response));
result = (Response) ser.Deserialize(reader);
}
}
if (firstException != null)
{
throw firstException;
}
return result;
}
次のコードは、スキーマファイルに対してXMLを手動で読み込んで検証し、resulting errors and/or warningsを処理できるようにします。
//Read in the schema document
using (XmlReader schemaReader = XmlReader.Create("schema.xsd"))
{
XmlSchemaSet schemaSet = new XmlSchemaSet();
//add the schema to the schema set
schemaSet.Add(XmlSchema.Read(schemaReader,
new ValidationEventHandler(
delegate(Object sender, ValidationEventArgs e)
{
}
)));
//Load and validate against the programmatic schema set
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Schemas = schemaSet;
xmlDocument.Load("something.xml");
xmlDocument.Validate(new ValidationEventHandler(
delegate(Object sender, ValidationEventArgs e)
{
//Report or respond to the error/warning
}
));
}
は今、明らかに、あなたはこれを自動的に行うためにXsd.exeではにより生成されたクラスを持たせたいとロード中に(上記のアプローチは、XMLファイルの第2のハンドリングを必要とする)が、前負荷の検証が可能になります不正な形式の入力ファイルをプログラムで検出することができます。
@ジョンサンダース - 私はクラスの生成コードは、その動作いつでもすぐに変更する可能性がある、とMSDNのサイトがXsd.exeではには、関連するオプションを示していないことを疑っていたので、私はそれを示唆するのが妥当だと思います回避策... – el2iot2
質問のテキストで、OPは無効な入力xmlに対して例外がスローされることを希望していると表現しています。このアプローチはそれを達成します。私はこれが実行できる唯一の方法であると主張していない、あるいはそれが最善の方法であるということさえもありません。しかし、私は過去にXML文書の一般的な検証に使用していたアプローチ(私の頭の上から外れている)に対応していました。 – el2iot2
- 1. のXmlSerializerとコレクションプロパティ
- 2. のXmlSerializerは
- 3. XmlSerializerを
- 4. XmlSerializerを
- 5. XmlSerializerエラーシリアルインターフェイスオブジェクト
- 6. の.NETのXmlSerializerは
- 7. 検証Laravelの検証
- 8. MVC 3の検証:検証
- 9. のXmlSerializerがSystem.InvalidOperationExceptionが
- 10. XmlSerializer extraTypesメモリリーク
- 11. アンドロイド:XmlSerializerをインデント
- 12. XMLSerializerからXElement
- 13. C#XmlSerializerトリムホワイトスペース
- 14. DataSetの検証とASP.NETフォームの検証
- 15. jQueryの検証 - URLの検証
- 16. jQuery検証エンジンのカスタムJavaScriptの検証
- 17. XML検証とJava検証
- 18. HTML5検証とPHP検証
- 19. ユニットテストでのXmlSerializerの問題
- 20. のXmlSerializer - LINQのツーSQL - タイプ
- 21. Scalazでの検証検証エラー
- 22. 流暢検証カスタムの検証ルール
- 23. jQuery検証プラグイン。非フォームフィールドの検証?
- 24. グループ検証と角型のコントロール検証
- 25. ruby cucumber検証フィールドの検証エラー
- 26. Jquery検証でフォーム配列の検証
- 27. Laravel(5.3.24+)検証:カスタムエラーメッセージでのカスタム検証
- 28. バックエンド検証とフロントエンド検証の同期
- 29. XmlSerializerと絵文字
- 30. XmlSerializerをUTF-8エンコーディング
この解決策をお寄せいただきありがとうございます。これにより、XmlReaderを介して検証することによってデシリアライズと並行して検証が行われるため、より良いアプローチです。 – el2iot2