2

.xsd スキームの作成に関して、このボードにいくつかの回答があることは知っていますが、私がやろうとしていることに本当に合うものは何も見つかりませんでした。

ネストされた要素などを含む非常に単純な XML ファイル (名前空間や dtd はありません) があり、そこから XSD ファイルを生成しようとしています。Microsoft のコード (XSD 生成に関しては非常に頻繁に取り上げられています) を反映し、クラス (メソッド)XSD.exeを使用してスキーム生成が行われていることを確認しました。XmlSchemaInferenceInferScheme()

これで、XML ファイルは名前空間の from を使用XDocument.Load()して既に読み込まれていますLINQ。しかし、 を見るとXmlSchemaInference、これは のみをXmlTextReaderxml ドキュメントの引数として取ることがわかります。

LINQ で使用するために XML ファイルをXDocumentロードしてから、もう一度ロードしXmlTextReaderて XSD を作成する必要があるということは正しいですか? またはXDocument、拡張メソッドが含まれているため、同様のメソッドを提供します.Validate()か?

.net は何百ものクラスを提供しているように見えますが、完全な機能を提供できるクラスはありません。:/

要するに私がやろうとしていること:

  • XDocument(LINQ)を使用して XML ファイルを読み込む
  • XDocument からネイティブ フレームワーク/XmlSchemeSetメソッド (何もない)を使用して XSD スキームを作成するxsd.exe
  • 新しい XDocument オブジェクトで、次を使用して保存XDocument.Save()

私がしなければならないと思われること:

  • を使用して XML ファイルを読み込みますXDocument
  • を使用して XML ファイルを再度ロードします。XmlTextReader
  • 渡すXmlTextReader_XmlSchemaInference
  • XmlTextWriter新しいものを渡すXmlSchemaInference
  • を使用して文書を保存XmlTextWriter

...かなりばかげていますよね?

4

1 に答える 1

0

XmlSchemaInference.InferSchemaは任意の XmlReader を入力として受け取るため、LINQ to XML XDocument があると仮定すると、http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument を使用してそのドキュメントに対して XmlReader を作成します。 .createreader.aspx . 次に、一般に XML ドキュメントにはさまざまな名前空間の XML 要素を含めることができるため、InferSchema メソッドは XmlSchemaSet を返します (対象の名前空間ごとにスキーマが必要なため)。その XmlSchemaSet を使用すると、スキーマをファイルに保存するためのすべてのオプションがあります。または、XDocument が必要な場合は、次を使用して作成します。

List<XDocument> schemas = new List<XDocument>();
foreach (XmlSchema schema in schemaSet.Schemas())
{
  XDocument schemaDoc = new XDocument();
  using (XmlWriter xw = schemaDoc.CreateWriter())
  {
     schema.Write(xw);
  }
  schemas.Add(schemaDoc);
}

XmlTextWriter と XmlTextReader は、XmlWriter/XmlReader の従来の実装です。後方互換性のある奇妙な構文解析や XML の書き込みが必要でない限り、避けるのが最善です。

ただし、一般に、XmlReader クラスと XmlWriter クラスは、.NET フレームワークの XML API で使用され、異なるクラス間の低レベルの相互作用を提供するクラスです。

説明からは明確ではありませんが、スキーマを XDocument インスタンスとして使用する場合、単にスキーマをファイルに保存する場合は、ファイルの各スキーマに対して schema.Write メソッドを直接呼び出すことができます。ストリーム。

于 2013-02-26T15:13:15.560 に答える