問題タブ [xmlschemaset]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 悪い xml データを処理するための正しいアプローチ
Web サービスから定期的に xml を取得し、データをデータベース テーブルに格納する小さな C# Windows サービスがあります。
残念ながら、Web サービスには時折不良データ (10 進数ではなく文字列) が含まれているため、失敗しています。Web サービスを制御することはできません (ソフトウェアからの検証されていないユーザー入力は変更できません) が、再入力できるように不良データをログに記録したいと考えています。
次のような単純なデータです。
このテーブルには、COL1 (NUMBER, 10)、COL2 (NUMBER, 10,2) の 2 つの列しかありません。
私は検証用の XmlReader とこの XSD を使用していました。
次に、データセットを dataset.ReadXml() および Update() します。
悪いデータにヒットするたびに、次の例外が発生します。
System.Xml.Schema.XmlSchemaValidationException が処理されませんでした
Message="'COL1' 要素が無効です - データ型 ' http://www.w3.org/2001/XMLSchema:decimal 'によると、値 'A40' は無効です' - 文字列 'A40' は有効な Decimal ではありません価値。"
この問題を回避する方法はいくつか考えられますが、それらはすべて少し面倒に感じます。もっと洗練された方法を学び、知識を向上させたいと思っています。これが私がこれまでに思いついたものです:
- 検証用 XML リーダーにロードする前に、Web サービスによって提供された XML を前処理し、不良ノードを完全に削除します。
- XmlSchemaValidationExceptions をキャッチし、それらから正常に続行しようとします (それについてはわかりません)。
- 検証 XML リーダーを使用しないでください。代わりに、検証されていない xml をデータセットに読み込むときに例外をキャッチします。(これもよくわからない)
- データセットに文字列列があり、更新するまで不良データを無視し、データベースが拒否したものをすべてキャッチします。
- ユーザーが最初にそれを正しく理解できるようになるまで、大きなマレットを持ってユーザーの上に立ちます (時間がかかりすぎます)。
- 他の何か?
更新: COL1 のユーザー入力を検証しないアプリケーションからデータが取得されるため、データが正しくない可能性がありますが、COL2 の数値は正しく計算され、COL1 は別のシステムに対応するはずです。無効なエントリは、修正できるように記録する必要があります。データがデータベースに書き込まれた後、別のシステムが COL1 が有効であることを確認し、ユーザーは他のシステムで正しく表示されない場合にすぐに気付くでしょう - とにかく手動でロードしていました :)
.net - 有効な XmlSchema を持つ IXmlSerializable (XMLSchema:schema 要素が宣言されていません..)
IXmlSerializable を実装しようとしています。私のクラスはシリアライズ可能を実装し、単一の文字列を書き込みます。XsdDataContractExporter (標準のもの) を使用してオブジェクト グラフ スキーマをエクスポートできるようにしたいと考えています。
クラスは単純な xml にシリアル化されます。
XmlSchemaProvider 属性に対応する GetSchema の私の実装は次のとおりです。
スキーマを生成してエクスポートできる必要があります。
次のエラーが表示されます。
スキーマをエクスポートしようとすると。xml - DataSet (xs:schema) を使用するスキーマをコンパイルするには?
C# で最も単純な Web サービスを作成しました。
生成されたスキーマ (Wsdl) は次のようになります。
スキーマには import/include 要素が含まれていないことに注意してください。
このスキーマを ac# System.Xml.XmlSchema にロードし、System.Xml.XmlSchemaSet に追加しようとしています。
最後の行で次の例外がスローされます。
.Net によって生成されたスキーマは、インポートされていないスキーマで宣言されている "s:schema" タイプを使用します。
- .Net が無効なスキーマを作成するのはなぜですか?
- とにかくスキーマをコンパイルする方法は?私がしたことは、 http://www.w3.org/2001/XMLSchemaでスキーマをダウンロードし、それを XmlSchemaSet にも追加したことです。そのオンラインスキーマにはDTD定義が含まれているため、これは機能しませんでした。手動で削除する必要がありましたが、現在はすべて機能しています。これは理にかなっていますか、それとも何か不足していますか?
xsd - SchemaSet のすべての派生型を取得する
特定の SchemaSet 内のすべての型を見つける必要があります。
私が今日行うことは次のとおりです。
1) SchemaSet.GlobalTypes.Values 内のすべての XmlSchemaTypes を繰り返します。
2) XmlTypeCode enum のすべての値を繰り返します。
一部の XmlSchemaTypes はスキーマの深さで (つまり、GlobalType としてではなく) 定義できるため、これでは不十分だと思います。
.NET で、GlobalTypes として定義されていないすべての型を取得する方法はありますか?
c# - xmldocument とネストされたスキーマ
c# と .net 3.5 を使用して、インクルードを持つスキーマに対して xml ドキュメントを検証しようとしています。
スキーマとインクルードは次のとおりです。
Schema1.xsd -> another.xsd を含める
another.xsd -> base.xsd を含める
Schema1.xsd を XmlDocument に追加しようとすると、次のエラーが発生します。
型 'YesNoType' が宣言されていないか、単純型ではありません。
Schema1.xsd スキーマをロードするときに base.xsd ファイルが含まれていないため、このエラーが発生していると思います。
XmlSchemaSet クラスを使用しようとしていて、XmlResolver uri をスキーマの場所に設定しています。
注 : すべてのスキーマは、同じディレクトリ E:\Dev\Main\XmlSchemas の下にあります。
ここにコードがあります
ネストされたインクルードを含むスキーマに対して xmldocument を検証することに関して、誰かが私を正しい方向に向けることができますか?
c# - XDocument.Validate で Xml スキーマを検証すると、XmlSchemaValidationException.LineNumber と LinePosition が 0 になる
XDocument.Validate 拡張メソッドで Xml スキーマを使用して Xml フラグメントを検証しようとしています。無効な Xml フラグメントが使用されると常に ValidationEventHandler が適切に起動しますが、XmlSchemaValidationException の LineNumber プロパティと LinePosition プロパティの両方が 0 になります。
上記の例での私の目標は、validationErrors を使用して、検証が失敗した理由をユーザーに通知することです。ただし、このメソッドを使用すると、LineNumber と LinePosition は両方とも 0 になります。
スニペットは十分に単純に見え、有効な Xml フラグメントと無効な Xml フラグメントの両方に対して検証するという点で期待どおりに機能するように見えます。
前もって感謝します!
powershell - PowerShell に XmlSchemaSet のような .NET オブジェクトをガベージ コレクションするように指示するにはどうすればよいですか?
多数の XML スキーマ (.xsd) ファイルをループ処理する PowerShell スクリプトを作成し、それぞれに対して .NETXmlSchemaSet
オブジェクトを作成し、 and を呼び出しAdd()
てCompile()
スキーマを追加し、すべての検証エラーを出力します。
このスクリプトは正しく動作しますが、どこかにメモリ リークがあり、数百のファイルで実行すると数ギガバイトのメモリが消費されます。
私が基本的にループで行うことは次のとおりです。
(この問題を再現するための完全なスクリプトは、https ://gist.github.com/3002649 の Gistにあります。実行するだけで、タスク マネージャーまたはプロセス エクスプローラーでメモリ使用量の増加を確認できます。)
いくつかのブログ投稿に触発されて、追加してみました
$schema
私もから拾ってAdd()
やってみました
これらはある程度の効果があるようですが、それでも漏れがあります。XmlSchemaSet
の古いインスタンスは、ガベージ コレクションを行わずにメモリを使用していると推測しています。
質問:上記のコードで使用されたすべてのメモリを再利用できることをガベージ コレクターに正しく教えるにはどうすればよいでしょうか。または、より一般的には、限られた量のメモリで目標を達成するにはどうすればよいですか?
c# - System.Xml.XmlSchemaSet compile()は、含まれているスキーマTargetNamespaceを埋めます
私は2つのxmlスキーマを持っています:
1)infrastructureRoot.xsd:
2)datatypes-base.xsd
次のC#コードを使用して、すべてのインクルードを含むルートスキーマをロードします。
実行後、「targetNamespace」の値は「urn:hl7-org:v3」に等しくなります。これは、元のスキーマ「datatypes-base.xsd」とは異なり、検証が中断されます。誰かが解決策を手伝ってくれますか?
.net - XmlSchemaSet が targetNamespace を明示的にカメレオン スキーマに設定する理由
たとえば、2 つの Xml スキーマがあります。
a.xsd:
b.xsd:
2 番目のスキーマにはtargetNamespaceがなく、カメレオン スキーマとして使用されます。
XmlSchemaSet を使用してこれらのスキーマをプリロードしようとしています。
しかし、私がそれを行った後、両方のスキーマに「テスト」ターゲット名前空間があります。インスタンス化されたスキーマ オブジェクトはソース スキーマと等しいはずですが、スキーマ "b.xsd" には当てはまりません。なぜそのように動作し、そのような動作を無効にする方法はありますか?
vb.net - XSD データ検証は .Net 4.0 で信頼できますか?
サービス プロバイダーが提供する WSDL といくつかの XSD ファイルを使用して、パブリック SOAP Web サービスのクライアントを作成しました。XSD ファイルに対してユーザー データを検証する簡単な方法を見つけたかったので、MSDN の標準的な例を使用し、XSD ファイルの XmlSchemaSet、XmlReader、およびエラー メッセージをキャッチする検証ルーチンを使用しました。(コードはhttp://msdn.microsoft.com/en-us/library/as3tta56.aspxで入手できます。) 一部のデータ要素では機能しますが、無効な場合にエラーをスローしないものもあります。「ValidationFlags = ValidationFlags Or XmlSchemaValidationFlags.ReportValidationWarnings」を含めると、「要素 'MyRequest' のスキーマ情報が見つかりませんでした」、「属性 'TheDate' のスキーマ情報が見つかりませんでした」など、多くの警告が表示されます。しかし、VS2010 IDE で XSD ファイルを開くことができ、その XML スキーマ エクスプローラーにはこれらの要素と属性が表示されます。
このように VS2010 で XML データを検証することに精通している方への主な質問は、XmlReader 検証で処理できる XSD ファイルの複雑さに制限はありますか? ターゲット名前空間のプレフィックスが XmlReader を混乱させる可能性はありますか? スキーマには何千もの複雑な型が定義されており、7 つの XSD ファイルにまたがっています。そのため、ユーザー入力フィールドごとに検証ルーチンを作成するのではなく、これを自動的に処理する必要がありました。
前もって感謝します。