2011-06-29 14 views
1

特定のシーケンスで必要なすべての要素を選択するために使用する次のコードがあります。スニペットは次のとおりです。Xpathを使用してXSDスキーマ内のノードを選択する

  XmlDocument schema = new XmlDocument(); 
      schema.Load(SchemaFileName); 
      XmlNamespaceManager xnm = new XmlNamespaceManager(schema.NameTable); 
      xnm.AddNamespace("xs", "http://www.w3.org/2001/XMLSchema"); 
      XmlNodeList list = schema.SelectNodes(Path); 

ただし、パスとして何を書き込むべきかはわかりません。理想的には、 "sequence"タグのすべての子ノードを選択したいのですが、Pathを "sequence"に設定すると、実行時に何も与えません。ノードリストは空白です。私がしようとしているのは、xmlファイルの検証に必要な要素の名前を(順番に)取得することです。

さらに、パスを "// @ name"として設定すると、属性として "name"を持つすべての要素が選択されます。私が望むのは、特に "シーケンス"タグの直後です。

"xs:sequence"としてPathを設定しようとしましたが、「Namespace ManagerまたはXsltContextが必要です。このクエリにはプレフィックス、変数、またはユーザー定義関数があります。私はすでにそれを設定すると思ったので変だ。

何か助けていただきありがとうございます!ありがとう!あなたがそれ以上の情報を必要とするなら、私はそれを提供してくれるでしょう。

敬具、

EDIT tf.rz

:私は Visual StudioのC#を使用しています2008年 .NET 3.5 SP1

基本的な前提は、私​​がについて投稿している別の質問に関連していますデータテーブルの列の並べ替え。しかし説明を短くする。私は、xsdスキーマが(適切な順序で)検証する要素の名前が必要なだけであると言う必要があります。私はいくつかのxsdスキーマを持っています。これらのスキーマはすべて同じ "フォーマット"に従っており、非常に静的なファイルです。したがって、私は安全にシーケンスタグを探し、すべての子ノードを取得できることを知っています。マイケルはスキーマを書く方法がたくさんあると述べていますが、私が作業しているスキーマはすべて似ていて静的なので、これを行うことができれば100%時間がかかるでしょう。 =)

答えて

1

基本的な問題は、XPathを使用して名前空間を使用するソースドキュメントにアクセスする方法を理解する必要があることです。これはかなり基本的なもので、このフォーラムにはそれを説明する1000の答えがあります。接頭辞の名前 - xs:sequence - が必要であり、接頭辞 "xs"がURI "http://www.w3.org/2001/XMLSchema"を表していることをXPathエンジンに伝える必要があります。 XPathエンジンを別のクラスに追加すると、コード内のクラス名が認識されないので、どちらがどちらか分かりません。

しかし、もっと深刻な問題があると思います。 XPath式を使用してソースXSDドキュメントから情報を抽出するのは、正規表現を使用してJavaプログラムから情報を抽出するようなものです。それは時間のいくつかの動作します。あなたが賢いなら、それはかなり多くの時間を働かせることができます。スキーマを書く方法があまりにも多いので、これはいつもうまくいくことはありません。もっと良いアイデアは、実際のスキーマプロセッサを使用してスキーマを処理し、そのAPIを使用してスキーマの内容に関する質問をすることです。

+0

ありがとう、理論的には今より多くの意味がありますが、ここでは名前空間を扱うことが大きな問題です。私は他のXML文書で問題なく簡単にノードリストを抽出しました。私はあなたが私がやっていることをやっている理由を理解するのを助けるために私のポストに少しの情報を追加しました。スキーマプロセッサを使用するこのコンセプトは私に興味をそそられています。私はそれについても少し研究します。このプロセスの名前がありますか、それとも単純に「スキーマの内容を取得するためにAPIを使用していますか」ですか?私の謝罪、私はかなりプログラミングに新しいです。 –

関連する問題